我正在尝试使用c#的borland c builder动态链接库( C++ DLL)。函数writeParameter工作得很好,它将正确的数据写入文件,但是我有一个异常“在PresentationFramework.dll中发生了'System.StackOverflowException‘类型的未处理异常”
C++代码:
#include <vcl.h>
#include <windows.h>
#include <fstream.h>
#pragma hdrstop
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
#pragma pack (push,1)
typedef struct
{
int a;
}ABC;
#pragma pack (pop)
//---------------------------------------------------------------------------
extern "C" void __declspec(dllexport) __cdecl writeParameter(ABC *abc)
{
ofstream outfile("result.txt");
outfile<< "A=" <<endl;
outfile << abc->a <<endl;
outfile.close();
}c#:
[StructLayoutAttribute(LayoutKind.Sequential)]
public class ABC
{
public int a;
}
[DllImport("D:\\monitorVC.dll", EntryPoint = "_writeParameter", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern void WriteParameter(
[In,MarshalAs(UnmanagedType.LPStruct)]
ABC abc
);
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
var abc = new ABC() {a = 123};
WriteParameter(abc);
}发布于 2011-02-04 16:54:48
请阅读这篇blog post,了解为UnmanagedType.LPStruct选择的非常糟糕的名称,以及它是如何做不到每个人都认为它是做的。像这样修改你的声明:
[DllImport(...)]
public static extern void WriteParameter([In] ref ABC abc);发布于 2011-02-04 16:45:42
类!= C#中的结构。
此外,在C#版本和C++版本之间,您的结构的打包也不相同。
发布于 2012-07-17 23:20:06
我知道这个问题发布已经有一段时间了,但我在尝试加载到VS2010 C#项目时也有过同样的经历,这是一个用CodeGear C++ Builder2007构建的.dll。
解决方法是从我的.dll中删除所有TForms。在我看来,从这些表单中导出的符号(顺便说一句,我无法删除)“导致”加载器出现堆栈溢出。
致以问候。
https://stackoverflow.com/questions/4896010
复制相似问题