C# DllImport StackOverflowException 我试图从C++中使用C++ DLL(Borland C Builder)。函数writeParameter工作正常,它将正确的数据写入文件,但我遇到了一个异常“PresentationFramework.dll中发生了类型为'System.StackOverflowException'的未处理异常”

C# DllImport StackOverflowException 我试图从C++中使用C++ DLL(Borland C Builder)。函数writeParameter工作正常,它将正确的数据写入文件,但我遇到了一个异常“PresentationFramework.dll中发生了类型为'System.StackOverflowException'的未处理异常”,c#,dllimport,stack-overflow,C#,Dllimport,Stack Overflow,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; } //--------------------------------------

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#中的结构

<> P.>你的结构在C版本和C++版本之间的包装不一样。

< P>阅读关于UnmanagedType.LPStruct的名字很不好的名字,以及它不怎么做每个人都认为它做的事。修改您的声明如下:

[DllImport(...)]
public static extern void WriteParameter([In] ref ABC abc);

我知道这个问题已经发布了一段时间,但我有过同样的经历,试图加载到VS2010 C项目,一个用CordPoice C++生成器2007构建的DLL。 解决方法是从my.dll中删除所有TForms。在我看来,这些表单中导出的符号(顺便说一句,我无法删除)导致加载程序出现堆栈溢出


关于。

Oops,这假设ABC像结构一样声明。如果你让它成为一个类,那么只需删除ref关键字。同样。函数可以工作(即获取正确的结构并将其写入文件),但是我有一个StackOverflowException,它对于给定的代码没有意义。但是一定要使用调试器,Debug+Windows+寄存器。查看通话前后ESP的值。还可以启用非托管代码调试,并在C代码上设置断点,以便可以单步执行。在ESP=0012E2A4之前,在ESP=0012E2A4之后,这很好。是其他原因造成的,而不是这个功能。寻找一个事件处理程序,该事件处理程序会产生副作用,从而再次调用该处理程序。
[DllImport(...)]
public static extern void WriteParameter([In] ref ABC abc);