我还没有找到关于这个主题的好参考。对于这个例子,我们将采用一些我试图移植到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”...假设这是正确的?
对这一个人有任何帮助吗?
答案 0 :(得分:4)
我还没有找到关于这个主题的好参考
奇怪的是,该网站目前处于停滞状态,但它是编组问题的一个非常好的资源。与此同时,您可以在http://web.archive.org/web/20080202041852/http://www.pinvoke.net
使用Archive.net的pinvoke.net存档答案 1 :(得分:0)
看起来不错。问题的第一部分(与MarshalAs有关)告诉编译器将托管的C#变量转换为PSTR。 .NET环境中的封送处理是指在托管和非托管环境之间传输数据。这些属性(以及其他几个属性)告诉编译器如何专门执行此操作。
第二点表示它将传递指向结构的指针。 .NET中的IntPtr类型是一种托管类型,用于保存特定的内存。在.NET世界中,指针(通常)不存在,尽管仍有引用类型。 CLR为我们完成指针和句柄管理。在编组指向数据结构或基元类型的指针时使用IntPtr结构
答案 2 :(得分:0)
除了P/Invoke网站之外,Adam Nathan的 .NET and COM: The Complete Interoperability Guide 值得添加到您的书架中,如果您不仅仅是对.NET互操作。
千电子伏