4

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 に変更し、マーシャリングを手動で行う必要がある場合、長くて退屈な作業が待っています。

4

1 に答える 1

3

以前のバージョンは運が良かった。あなたのコードは常に壊れています。文字列の戻り値を持つ p/invoke マーシャラー

  • コンテキストを新しい文字列にコピーし、
  • CoTaskMemFree次に、ネイティブ コードが返したポインターを呼び出します。

何らかの理由で、以前のバージョンの Windows ではそれを回避できました。しかし、最新バージョンの Windows でエラーが発生しています。

この文字列が DLL で静的に割り当てられる可能性は非常に高いです。したがって、それを解放しようとするべきではありません。

あなたの前に少し仕事があるようです。

于 2012-10-04T13:15:28.493 に答える