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

时间:2013-07-12 17:11:48

标签: marshalling dllimport

我有一个我需要从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要求使用" unsafe"。

1 个答案:

答案 0 :(得分:5)

这不是一个教程,但它有很多关于使用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属性进行直接转换。

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