3

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

对这个人有什么帮助吗?

4

3 回答 3

4

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

干得好。

奇怪的是,该站点目前已关闭,但它是编组问题的非常好的资源。同时,您可以在http://web.archive.org/web/20080202041852/http://www.pinvoke.net使用 Archive.net 的 pinvoke.net 存档

于 2009-04-07T23:19:42.783 回答
0

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

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

于 2009-04-07T23:15:27.160 回答
0

除了P/Invoke站点之外,如果您对 .NET 互操作感兴趣的话,Adam Nathan.NET and COM: The Complete Interoperability Guide是值得添加到您的书架上的。

凯夫

于 2009-04-08T02:43:27.257 回答