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