2

次のようなエクスポートを含むCDLLがあります。

__declspec(dllexport) int Function(
    char *password,
    unsigned char *ssid,
    int ssidlength,
    unsigned char *output)
{

C#側では、これを次のように使用しています。

[DllImport("myDLL.dll", SetLastError = true)]
protected static extern int Function(
    [MarshalAs(UnmanagedType.LPStr)] 
    string password,
    [MarshalAs(UnmanagedType.LPStr)] 
    string ssid,
    int ssidlength,
    [MarshalAs(UnmanagedType.LPArray)]
    byte[] output);

上記は実際には問題なく機能しますが、マーシャリングに必要なものを何として理解するのに時間がかかりました。考えられるすべてのc/cppデータ型とそれに相当するC#マーシャリングをリストしたガイドはありますか?

次のようなもの:
c => C#
Char * myVar => [MarshalAs(UnmanagedType.LPStr)] string myVar
...
しかし、すべてのタイプをリストしますか?

私が尋ねる理由は、「ref」、out、IntPtrをいつ使用するか、または何かをマーシャリングするためにどのタイプを使用するかがわからないためです。

最後に、上記のコードでは、unsignedchar配列へのポインターを文字列への長いポインターとしてマーシャリングしています。これは正しくないようですが、機能します。これがbyte[]配列になってしまう方が理にかなっていますが、動作させることができません。オンラインリファレンスがあれば、私は使用できます...

4

2 に答える 2

1

MSDN には多くのガイドがあります。

そうは言っても、pinvoke.netPInvoke Interop Assistantは、ネイティブ コードを操作するための優れたリソースです。

特に相互運用アシスタントを使用すると、多くの場合、これが非常に簡単になります。

于 2009-06-26T23:53:38.870 に答える
0

http://pinvoke.net/default.aspx/misc.Suggested%20Reading

于 2009-06-26T22:54:20.927 に答える