C++でStringHandle
を表すIntPtr
値であるLPCWSTR
フィールドを持つクラスを使用しています。
internal IntPtr StringHandle; // LPCWSTR
文字列があると言ってください:string x = "abcdefg"
文字列ハンドルを使用して文字列の先頭をポイントし、C++ LPCWSTRのようにするにはどうすればよいですか?
最初に文字列をアンマネージメモリにコピーしてから、その場所からIntPtr
を取得する必要があります。あなたは次のようにそうすることができます:
IntPtr strPtr = Marshal.StringToHGlobalUni(x);
また、アンマネージメモリを必ず解放する必要があります。
Marshal.FreeHGlobal(strPtr);
これらすべてを試して/最後に行うのが最善です。
管理対象文字列moveガベージコレクタがヒープを圧縮するときのメモリ内。そのため、安定したアドレスがなく、LPCWSTRに直接キャストすることはできません。 GCHandle.AddrOfPinnedObjectを使用するには、GCHandle.Alloc()を使用して文字列を固定するか、Marshal.StringToHGlobalUni()を使用して文字列をアンマネージメモリにコピーする必要があります。
アドレスをしばらく安定させる必要がある場合は、コピーを強くお勧めします。
Marshal
クラスでStringTo *メソッドの1つを使用したい