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);

ここでの質問は次のとおりです。「PSTRpPathFile」は「[MarshalAs(UnmanagedType.LPStr)] stringpPathFile」である必要があることを教えてくれる良いガイドはありますか...それが正しいと仮定しますか?

または、「PMAPPING」構造体へのポインタが「outIntPtr 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

P / Invokeサイトに加えて、 Adam Nathan.NETおよびCOM:完全な相互運用性ガイドは、.NET相互運用機能に一時的な関心以上のものがある場合に、本棚に追加する価値のあるものです。

Kev

于 2009-04-08T02:43:27.257 に答える
0

そうですね。質問の最初の部分(MarshalAsに関連する)は、マネージC#変数をPSTRに変換するようにコンパイラーに指示します。.NET環境でのマーシャリングとは、管理対象環境と管理対象外環境の間でデータを転送することです。これらの属性(他のいくつかの属性の中でも)は、コンパイラーに具体的にそれを行う方法を指示します。

2番目のポイントは、構造体へのポインターを渡すことを示しています。.NETのIntPtrタイプは、特定のメモリを保持するために使用されるマネージドタイプです。.NETの世界では、参照型はまだありますが、ポインターは(一般的に)存在しません。ポインターとハンドルの管理は、CLRによって行われます。IntPtr構造体は、データ構造またはプリミティブ型へのポインターをマーシャリングするときに使用されます

于 2009-04-07T23:15:27.160 に答える