2

我有一个来自供应商的 DLL,我需要从 C# 调用。我知道 C# 数据类与 C++ 数据类型不直接兼容。

所以,假设我有一个接收数据并返回“字符串”的函数。

(像这样)

string answer = CreateCode2(int, string1, uint32, string2, uint16);

我必须做什么才能使输入参数兼容,然后使结果字符串兼容?

请 - 我从来没有这样做过:不要给出“使用 P/Invoke”或“使用 Marshal”之类的答案,我需要一个带有示例的教程。

我看到的所有 P/Invoke 示例都来自 .NET Framework 1.1,而 Marshall(没有教程)完全让我感到困惑。

此外,我还看到了一些示例,这些示例告诉我何时创建 extern 函数以将所有数据类型替换为 void*。这使我的 IDE 要求我使用“不安全”。

4

1 回答 1

5

这不是一个教程,但它有很多关于使用 P/Invoke 在 C# 中使用 P/Invoke 调用 Win32 DLL
的好信息 它会让您了解术语、基本概念、如何使用 DllImport 和应该足以让你前进。

MSDN 上有一个教程:Platform Invoke Tutorial
但它很短,老实说,我上面提到的那个是一个更好的信息来源,但那里有很多。

此处描述的 PInvoke 签名工具包也很有用。
并可在此处下载。
它允许您粘贴非托管方法签名或结构定义,它会为您提供 .NET P/Invoke 等效项。它不是 100% 完美的,但它比试图自己解决所有问题要快得多。

关于编组,我想说从简单开始。如果您有某种指针,而不是尝试使用 Marshal 将其直接转换为方法签名中的某个 .NET 类型,有时将其视为 IntPtr 然后使用 Marshal.Copy 会更容易。 PtrToString、.PtrToStructure 和其他类似方法将数据转换为 .NET 类型。
然后,当您掌握了全部内容后,您可以继续使用 Marshal 属性进行直接转换。

在这里这里这里有一组很好的关于编组的 3 部分文章。

于 2013-07-18T11:12:49.507 回答