P / Invokeおよび.NETTarget Framework [重複]
この問題は私を壁に押し上げています...ただ言っています。
私の会社にはレガシー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リポジトリを作成できます。
回答
文字列の問題であることがわかったので、少し検索して、このSOの質問を見つけました。
したがって、最終的にはこのBSTR
アプローチを使用しました。
BSTR SayHello() {
return ::SysAllocString(L"Hello");
}
[DllImport("DBReplicator.Lib.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string SayHello();
...でも、どうやって漢字を取得したのかはまだわかりません。