DllImport StackOverflowException

时间:2011-02-04 08:39:54

标签: c# dllimport stack-overflow

我正在尝试使用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);
        }

3 个答案:

答案 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。在我看来,这些形式的导出符号(顺便说一句,我无法删除)将加载器“引导”到堆栈溢出。

问候。