gpt4 book ai didi

marshalling - 从 C#.NET 调用非托管 DLL 所需的教程

转载 作者:行者123 更新时间:2023-12-02 04:57:57 25 4
gpt4 key购买 nike

我有一个来自供应商的 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 要求我使用“不安全”。

最佳答案

这不是一个教程,但它提供了很多关于使用 P/Invoke 的有用信息 Calling Win32 DLLs in C# with P/Invoke
它会让您了解术语、基本概念、如何使用 DllImport 并且应该足以让您继续学习。

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

PInvoke 签名工具包也很有用,描述了 here .
并可下载here .
它允许您粘贴非托管方法签名或结构定义,它会给您等效的 .NET P/Invoke。它不是 100% 完美的,但它比尝试自己弄清楚所有事情让你走得更快。

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

关于编码有很好的 3 部分文章集 here , herehere .

关于marshalling - 从 C#.NET 调用非托管 DLL 所需的教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17620396/

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