0

長年の読者、初めてのポスター。いつかここで質問に答えたいと思っています...

つまり、「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#フォームの.csファイル内の同じ場所から次のように呼び出されます。

bool isDataValid = IsDataValid();

次のメッセージとともに例外が返されます。

「DLL'CarChipSDK_C_Sharp.dll'で指定されたエントリポイント'IsDataValid()'が見つかりません。

c ++コードから生成された.dllでdumpbin.exeと依存関係ウォーカーを使用しましたが、IsDataValid()エントリポイントがあることが示されています。

すべての助けは大歓迎です...

問題が解決しました!愚かな私、これは私の現在の会社での以前の協同組合からのコードでした、彼は私がbin/debugフォルダーにビルドしていたbin/releaseフォルダーから.dllを読んでいたことがわかりました。知っているべきだった。心からお詫び申し上げます。

4

1 に答える 1

8

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で実行すると、それらの関数がコンパイルされるまでに実際にどのような名前が付けられているかがわかります。

于 2011-01-15T00:06:09.703 に答える