一直在尝试并搜索各种来源但无法找到解决方案。我从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中的正确函数,但传递的参数已损坏,显示的值与传递的值完全不同。对于字符串参数也会发生这种情况。有没有解决托管代码和非托管代码之间的参数编组问题?
答案 0 :(得分:0)
您不能使用DLLImport或PINVOKE来使用C ++类,因为它仅适用于C样式函数。
如果要在C#中使用C ++类,则需要使用C ++ / CLI。您可以在本机C ++中创建一个非托管DLL,然后创建一个简单的C ++ / CLI包装器,它从本机dll调用方法。之后,您只需将C ++ / CLI托管dll添加到项目中,并将其用作C#类,而不使用任何DllImports和PINVOKE。这将是一个非常灵活的解决方案,易于扩展。在MSDN上,您可以找到如何使用C ++ / CLI的示例。