web-dev-qa-db-ja.com

C#.NETのIntPtrが文字列値を指すようにします

C++でStringHandleを表すIntPtr値であるLPCWSTRフィールドを持つクラスを使用しています。

internal IntPtr StringHandle; // LPCWSTR

文字列があると言ってください:string x = "abcdefg"

文字列ハンドルを使用して文字列の先頭をポイントし、C++ LPCWSTRのようにするにはどうすればよいですか?

19
Saher Ahwal

最初に文字列をアンマネージメモリにコピーしてから、その場所からIntPtrを取得する必要があります。あなたは次のようにそうすることができます:

IntPtr strPtr = Marshal.StringToHGlobalUni(x);

また、アンマネージメモリを必ず解放する必要があります。

Marshal.FreeHGlobal(strPtr);

これらすべてを試して/最後に行うのが最善です。

31
Eren Ersönmez

管理対象文字列moveガベージコレクタがヒープを圧縮するときのメモリ内。そのため、安定したアドレスがなく、LPCWSTRに直接キャストすることはできません。 GCHandle.AddrOfPinnedObjectを使用するには、GCHandle.Alloc()を使用して文字列を固定するか、Marshal.StringToHGlobalUni()を使用して文字列をアンマネージメモリにコピーする必要があります。

アドレスをしばらく安定させる必要がある場合は、コピーを強くお勧めします。

7
Hans Passant

Marshal クラスでStringTo *メソッドの1つを使用したい

1
CodingGorilla