2011-01-15 3 views
0

長時間の読者、初めてのポスター。だから、との種類の似てC#で消費された外部の.dllリソースにエントリポイントを正しく作成する方法

私はここで質問に答えることを願って一日...:"Unable to find an entry point named [function] in dll" (c++ to c# type conversion)

しかし、私は同じソリューションを適用するように見えることはできません...基本的に

、I C++プロジェクトのソースファイルに定義され

extern "C" { 
    __declspec(dllexport) bool IsDataValid(); 
} 

:としてC++プロジェクトのヘッダファイルに定義され

:(符号新しいメソッドを書いiatureのみ)

extern bool __cdecl IsDataValid() { 
//function stuf......... returns a bool 
} 

としてC#プロジェクト内のフォームのC#アプリケーションにインポート:

bool isDataValid = IsDataValid(); 
:それは次のようにC#のフォームは.csファイル内の同じ場所から呼び出され

[DllImport("CarChipSDK_C_Sharp.dll", EntryPoint = "IsDataValid")] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool IsDataValid(); 

メッセージの例外を返します。

"エントリポイント を見つけられませんでした。 '' CarChipSDK_C_Sharp.dll 'という名前のIsDataValid()が見つかりました。

Iは、C++コードから生成された.dllにDUMPBIN.EXEと依存関係ウォーカーを使用していると、それはIsDataValid()エントリポイントを有することを示しています。

すべてのヘルプははるかに高く評価されています...

問題は解決します!愚かな私、これは私の現在の会社の以前の協同のコードだった、彼はbin/releaseフォルダから.dllを読んでいたことが判明した。知っていたはずです。私の心からの謝罪。

答えて

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でそれを実行すると、それらの関数がコンパイルされた時に実際に名前が付けられているものが表示されます。

+0

答えてくれてありがとう、私は仕事をやめたので、月曜日にこれを試してみましょう。期待しているようだ!本当にありがとう。 –

+0

依存関係ウォーカーは、GUIを好む人のために、すばらしい表形式でdumpbinと同じ情報を表示します。 –

+0

@mcbobo:問題ありません。私はシステムで働いているときにinteropをたくさん使っていますし、ドライバインターフェイスなどのGUIを常時構築しなければなりません。 –

関連する問題