それはただの好奇心です。おそらく、このようなことをした人がこの世界にいます:
C 関数をエクスポートし、DllImport を介して C# コードからロードする必要があります
const wchar_t * SysGetLibInfo() {
return dllmanager.SysGetLibInfo();
}
そのための最善の方法は、広く推奨されていることですが、IntPtr を宣言してから、関数を使用して文字列に変換することです。言い換えれば、このようなもの
[DllImport(dll, CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr SysGetLibInfo();
// ...
Marshal.PtrToStringUni(SysGetLibInfo());
このアプローチは機能します。しかし、それを自動的に行う方法はありますか? SysGetLibInfo が文字列を返すようにするには? 次のような提案がいくつか見つかりました。
[DllImport(dll, CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.LPWStr)]
private static extern string SysGetLibInfo();
しかし、それは機能しません。さまざまな例と乏しいレポートによると、機能しないはずです。
IntPtr を文字列に変換する MarshalAs のような独自の属性を記述する方法はありますか? これに似たもの:
[DllImport(dll, CallingConvention = CallingConvention.Cdecl)]
[return: MyOwnMarshalPtrToStringUni]
private static extern string SysGetLibInfo();
情報や有用なリンク、例、書籍について事前に感謝します。繰り返しますが、それはただの好奇心です。
PtrToStringUni を使用して結果を文字列に変換する別の関数で SysGetLibInfo をラップするという PS 提案はオプションではありません;)