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

时间:2009-04-07 23:10:33

标签: c# marshalling dllimport

我还没有找到关于这个主题的好参考。对于这个例子,我们将采用一些我试图移植到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”...假设这是正确的?

对这一个人有任何帮助吗?

3 个答案:

答案 0 :(得分:4)

  

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

Here you go.

奇怪的是,该网站目前处于停滞状态,但它是编组问题的一个非常好的资源。与此同时,您可以在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互操作。

千电子伏