我正在尝试使用c#中的C ++ DLL(borland c builder)。函数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);
}
答案 0 :(得分:2)
请阅读此blog post,了解UnmanagedType.LPStruct选择非常糟糕的名称,以及它如何做不到每个人都认为的做法。修复你的声明如下:
[DllImport(...)]
public static extern void WriteParameter([In] ref ABC abc);
答案 1 :(得分:0)
class!= C#中的struct。
此外,您的结构的打包在C#版本和C ++版本之间是不一样的。
答案 2 :(得分:0)
我知道自问题发布以来已经有一段时间了,但我尝试加载到VS2010 C#项目,使用CodeGear C ++ Builder 2007构建的.dll时也有同样的经验。
解决方法是从我的.dll中删除所有TForms。在我看来,这些形式的导出符号(顺便说一句,我无法删除)将加载器“引导”到堆栈溢出。
问候。