C#で消費されたC ++で記述された外部.DLLリソースにエントリポイントを適切に作成する方法
-
11-10-2019 - |
質問
長年の読者、初めてのポスター。ある日、私はここで質問に答えたいと思っています...
だから、それは次のようなものです: 「dllで[function]という名前のエントリポイントを見つけることができない」(C ++からC#タイプ変換)
しかし、私は同じ解決策を適用できないようです...
基本的に、私は新しい方法を書きました:
C ++プロジェクトのヘッダーファイルで定義されています。
extern "C" {
__declspec(dllexport) bool IsDataValid();
}
C ++プロジェクトのソースファイルで定義されています:(シグナルのみ)
extern bool __cdecl IsDataValid() {
//function stuf......... returns a bool
}
C#プロジェクト内のフォームC#アプリケーションにインポート:
[DllImport("CarChipSDK_C_Sharp.dll", EntryPoint = "IsDataValid")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsDataValid();
C#forms .csファイル内の同じ場所から次のように呼ばれます。
bool isDataValid = IsDataValid();
メッセージで例外を返しています。
「エントリポイントを見つけることができません」isdatavalid() '' carchipsdk_c_sharp.dll 'に名前が付けられました。
C ++コードから生成された.dllでDumpbin.exeと依存関係のウォーカーを使用しましたが、ISDatavalid()エントリポイントがあることを示しています。
すべての助けは大歓迎です...
問題が解決しました!バカな私、これは私の現在の会社の以前の協同組合のコードであり、彼は私がビン/デバッグフォルダーに構築しているときにビン/リリースフォルダーから.dllを読んでいたことが判明しました。知っているべきだった。心からお詫びします。
解決
あなたはC ++名のマングリングに遭遇しています。 c ++関数をextern "c"として宣言します。だから、あなたのC ++モジュールで...
extern "C" __declspec(dllexport) bool IsDataValid();
エントリポイント仕様属性も必要ありません。あなたのC#宣言は次のとおりです。
[DllImport("CarChipSDK_C_Sharp.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsDataValid();
将来の参照のために、Dumpbin.exeはこのような問題を分析するための非常に有用なプログラムです。 DLLで実行すると、コンパイルされるまでにそれらの関数が実際に命名されているものがわかります。