PInvoke 経由でネイティブ dll を使用する C# プロジェクトがあります。現在まで、XP と Windows 8 コンシューマー プレビューの両方で VS2010 を使用してプロジェクトを開発してきました。
それ以来、Windows 8 リリースと VS2012 に更新しました。最初の PInvoke を実行するとすぐに、同じプロジェクトがクラッシュします。C 宣言は次のとおりです。
const char * func(void);
C# P/Invoke 宣言:
[DllImport("libspotify.dll",CharSet = CharSet.Ansi)]
internal static extern string sp_build_id();
呼び出し規約は stdcall です。さて、この配置は常にうまく機能しており、私の理解では、 const char* は自動的に文字列にマーシャリングされるということでした。ただし、Windows 8 で VS2012 から実行すると、これがクラッシュします。IntPtr を返すように C# 宣言を変更すると、機能します。
以前のバージョンが機能したのは運が良かっただけですか、それともコードは大丈夫でしたか? これが機能しなくなった理由はありますか?すべての文字列宣言を IntPtrs に変更し、マーシャリングを手動で行う必要がある場合、長くて退屈な作業が待っています。