从C#.NET调用非托管DLL需要教程

问题描述 投票:1回答:1

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

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

(像这样)

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

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

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

我见过的所有P / Invoke示例都来自.NET Framework 1.1,而Marshall(没有教程)让我很困惑。

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

marshalling dllimport
1个回答
5
投票

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

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

同样有用的是PInvoke Signature Toolkit,描述了here 。 和可下载的here。 它允许您粘贴非托管方法签名或结构定义,它将为您提供.NET P / Invoke等效项。这并不是100%完美,但它比你自己弄清楚一切都要快得多。

关于编组专门,我会说开始简单。如果你有一些东西是某种指针,而不是试图使用Marshal直接将它转换为方法签名中的某些.NET类型,有时可能更容易将其视为IntPtr,然后使用Marshal.Copy ,. PtrToString,.PtrToStructure以及将数据转换为.NET类型的其他类似方法。 然后,当您掌握了整个事物时,您可以继续使用Marshal属性进行直接转换。

关于编组hereherehere的文章有3篇。

© www.soinside.com 2019 - 2024. All rights reserved.