C#格式化外部Dll函数参数

我还没有找到关于这个主题的好参考。 对于这个例子,我们将采用一些我试图移植到C#的C ++代码。

在C ++领域,我们有一个外部库函数的原型:

extern "C" DWORD EXPORT FILES_GetMemoryMapping( PSTR pPathFile, PWORD Size, PSTR MapName, PWORD PacketSize, PMAPPING pMapping, PBYTE PagesPerSector); 

并在其中使用如下:

 FILES_GetMemoryMapping((LPSTR)(LPCTSTR)MapFile, &Size, (LPSTR)MapName, &PacketSize, pMapping, &PagePerSector); 

现在我正在尝试将第一行移植到C#,这里是我没有明确路径的地方。

这是我到目前为止所得到的:

 [DllImport("Files.DLL")] public static extern uint FILES_GetMemoryMapping( [MarshalAs(UnmanagedType.LPStr)] string pPathFile, out ushort Size, [MarshalAs(UnmanagedType.LPStr)] string MapName, out ushort PacketSize, IntPtr pMapping, out byte PagesPerSector); 

现在的问题是:有没有好的指南告诉我“PSTR pPathFile”应该是“[MarshalAs(UnmanagedType.LPStr)] string pPathFile”……假设这是正确的?

或者,指向“PMAPPING”结构的指针变为“out IntPtr pMapping”…假设这是正确的?

对这一个人有什么帮助吗?

我还没有找到关于这个主题的好参考

干得好。

奇怪的是,该网站目前正在下降,但它是编组问题的一个非常好的资源。 同时,您可以在http://web.archive.org/web/20080202041852/http://www.pinvoke.net上使用Archive.net的pinvoke.net档案。

看起来不错。 问题的第一部分(与MarshalAs有关)告诉编译器将托管的C#变量转换为PSTR。 .NET环境中的封送处理是指在托管和非托管环境之间传输数据。 这些属性(以及其他几个属性)告诉编译器如何具体地执行它。

第二点表明它将传递指向结构的指针。 .NET中的IntPtr类型是一种托管类型,用于保存特定的内存。 在.NET世界中,指针(通常)不存在,尽管仍有引用类型。 CLR为我们完成指针和句柄管理。 在编组指向数据结构或基元类型的指针时使用IntPtr结构

除了P / Invoke网站之外, Adam Nathan的.NET和COM:完整互操作性指南是值得添加到你的书架的东西,如果你不仅仅是对.NET互操作的兴趣。

千电子伏