gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:32:35 24 4
gpt4 key购买 nike

一整天都在尝试并搜索各种资源,但找不到解决方案。我正在从 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。您可以在 native C++ 中创建一个非托管 dll,然后创建一个简单的 C++/CLI 包装器,它从 native dll 调用方法。之后,您可以简单地将 C++/CLI 管理的 dll 添加到项目并将其用作 C# 类,而无需任何 DllImports 和 PINVOKE。这将是一个非常灵活的解决方案,易于扩展。在 MSDN 上,您可以找到如何使用 C++/CLI 的示例。

关于c# - 从 C# 传递到非托管 dll 后参数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30864929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com