3

それはただの好奇心です。おそらく、このようなことをした人がこの世界にいます:

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 提案はオプションではありません;)

4

2 に答える 2