元Mar“ char *” C#で
-
03-07-2019 - |
質問
DLLで次のC関数を指定します。
char * GetDir(char* path );
この関数をC#にP / Invokeして、char *を適切にマーシャリングします。 .NETはLPCTSTRの実行方法を知っているようですが、この関数を呼び出したときにNotSupportedExceptionが発生しないマーシャリングを把握できない場合。
解決
OregonGhostの答えは、GetDirから返されたchar *がHGlobalまたはLocalAllocに割り当てられている場合にのみ正しいです。どちらかは覚えていませんが、CLRはPInvoke関数からの文字列戻り値の型がどちらか一方に割り当てられていると想定します。
より堅牢な方法は、GetDirの戻り値をIntPtrに入力することです。その後、文字列型を取得するために、Marshal.PtrToStringAnsi関数のいずれかを使用できます。また、選択した方法で文字列を解放する柔軟性も得られます。
[DllImport("your.dll", CharSet = CharSet.Ansi)]
IntPtr GetDir(StringBuilder path);
GetDirの動作に関するその他のヒントを教えてください。入力文字列を変更しますか?返される値はどのように割り当てられますか?あなたがそれを提供できるなら、私ははるかに良い答えをすることができます。
他のヒント
試用
[DllImport("your.dll", CharSet = CharSet.Ansi)]
string GetDir(StringBuilder path);
stringは自動的に0で終わる文字列にマーシャリングされ、CharSetプロパティを使用して、UnicodeではなくANSIを使用する必要があることをMarshallerに伝えます。 注:const char *にはstring(またはSystem.String)を使用しますが、char *にはStringBuilderを使用します。
この例のように、MarshalAsを試すこともできます。
>所属していません StackOverflow