从C#传递到非托管dll后参数不正确

时间:2015-06-16 10:24:03

标签: c# c++ dll

一直在尝试并搜索各种来源但无法找到解决方案。我从c#调用导入的非托管DLL函数。

C ++类看起来像:

class  MyModule
{
public:
    MYMODULEDLL_API int __cdecl Init(int);
...

在C#中定义如下:

 [DllImport("MyModule_x64.dll", EntryPoint = 
  "?Init@MyModule@@QEAAHH@Z", CallingConvention = CallingConvention.Cdecl)]
    public static extern int Init(int len);

并且这样打电话:

Init(configFileName.Length);

我可以在调试器中看到正在调用dll中的正确函数,但传递的参数已损坏,显示的值与传递的值完全不同。对于字符串参数也会发生这种情况。有没有解决托管代码和非托管代码之间的参数编组问题?

1 个答案:

答案 0 :(得分:0)

您不能使用DLLImport或PINVOKE来使用C ++类,因为它仅适用于C样式函数。

如果要在C#中使用C ++类,则需要使用C ++ / CLI。您可以在本机C ++中创建一个非托管DLL,然后创建一个简单的C ++ / CLI包装器,它从本机dll调用方法。之后,您只需将C ++ / CLI托管dll添加到项目中,并将其用作C#类,而不使用任何DllImports和PINVOKE。这将是一个非常灵活的解决方案,易于扩展。在MSDN上,您可以找到如何使用C ++ / CLI的示例。