P / Invokeおよび.NETTarget Framework [重複]

Jan 22 2021

この問題は私を壁に押し上げています...ただ言っています。

私の会社にはレガシーC ++ライブラリがあり、.NETラッパーの作成を任されています。
私はC ++またはP / Invokeの経験がないので、最初は簡単な方法を試しています。

私は公式ドキュメントを読み、素晴らしいチュートリアルも見つけました。
ただし、消費するアプリのターゲット.NETフレームワークが違いを生むことを発見しました。
チュートリアルのP / Invokeコードは正常に機能しますが、彼が.NET Framework4クライアントプロファイルをターゲットにしていることに気付きました。
ブレークポイントを配置すると、それらがヒットし、すべてが期待どおりに機能します。4を超えるフレームワークをターゲットにすると、プログラムは例外なくクラッシュします。

私はC ++で定義された本当に簡単なメソッドを持っています:
framework.h

extern "C" {
    API char* SayHello();
}

dllmain.cpp

char* SayHello() {
    return (char*)"Hello";
}

C#

        [DllImport("PInvokeTest.dll")]
        public static extern string SayHello();

(属性にCallingConventionとCharSetをさまざまな組み合わせで設定しようとしましたが、漢字を取得できましたが、Framework 4よりも高い機能はありません)

私のC ++プロジェクトにはAPI=__declspec(dllexport)、プリプロセッサ定義が設定されており、呼び出し規約が設定されています_stdcall (\Gz)(_cdeclも試しました)。
C#プロジェクトはFramework 4で正常に機能します。それ以上に変更すると、例外なく終了します。
私はまた、実際にそこにあることを私に示している依存関係GUIを見つけましたSayHello

私たちの会社は4.6.1を使用していますが、この記事に出くわしてPInvokeStackImbalanceにたどり着きましたが、私の場合は何もしません。

どんな助けでも大歓迎です。
必要に応じて、一時的なGitHubリポジトリを作成できます。

回答

LukeTO'Brien Jan 22 2021 at 19:50

文字列の問題であることがわかったので、少し検索して、このSOの質問を見つけました。
したがって、最終的にはこのBSTRアプローチを使用しました。

BSTR SayHello() {
    return ::SysAllocString(L"Hello");
}
        [DllImport("DBReplicator.Lib.dll")]
        [return: MarshalAs(UnmanagedType.BStr)]
        public static extern string SayHello();

...でも、どうやって漢字を取得したのかはまだわかりません。