2012-03-06 10 views
3

最終的にC++ DLLが完成しましたが、C#から呼び出すのに問題があります。私は別の例外、 'DLLNotFoundException'を取得するフォルダから削除するとき、それは間違いなくDLLを見つけることです。完全なエラーの説明は、 "DLL 'CComms.dll'で 'GetNewInstance'という名前のエントリポイントを見つけることができません。機能はすべてのようにC#からアンマネージ関数を呼び出そうとすると、System.EntryPointNotFoundExceptionが発生する

__declspec(dllexport) DWORD __stdcall GetNewInstance(); 

のようにC++で輸出されていると私は「DUMPBIN /輸出はCComms.dll」私は、私はいくつかの奇妙な出力を得る使用する場合、私はそう

[DllImport("CComms.dll")] 
private static extern uint GetNewInstance(); 
// ... and in main 
uint inst = GetNewInstance(); 

のようなC#のからそれを呼び出しますわからない関数名がマングルされたものであり、それは、エントリポイントに

7 6 00002FB0 [email protected]@YGKXZ = [email protected]@YGKXZ (unsigned long 
__stdcall GetNewInstance(void)) 

を見つける傾ける理由ですか私の代わりに__stdcallの__cdeclを使用してみました、と同じ結果を持っていました。私はこのプロジェクトでやっていることにとても近いので、これは私が最後までやり遂げた最後のものです。

ありがとうございました。

+1

を解決私はあなたが私を参照してくださいntion "CComms.dll"、DllImport属性は "VLTGLSCommsDLL.dll"を検索しているようです。それは間違っているのですか? – Ani

+1

"関数はすべてC++でエクスポートされます。"エクスポート宣言に 'extern" C "'を追加して通常の '__stdcall'エクスポート名を取得できますか?私は両方のタイプをインポートすることはできませんでした。 – Rup

+0

申し訳ありませんが、エクスポートされた関数のすべてがextern "C"ブロックにラップされていることを説明する必要がありました。ここでは例として関数の1つを示していますが、DLL名については、これを入力するときに古いものと新しいものとの間で混乱してしまいました。正しいDLLを探していて、DLLNotFoundExceptionをスローします。すべての場所で正しいDLL名を持つようにコードを変更しました。 –

答えて

0

DLLを作成する2つの方法があります。

1つは関数のアドレスを取得すること(oldschoolの方法)であり、2つ目はパラメータと名前(たとえば ".net"で使用される "新しい"方法)です。

私はあなたのC++ DLLを使用していない正しく

たぶん、あなたはここでGetProcAddressGetProcAddress Msdn

を使用する必要があります想像便利

0

に来るかもしれないDll exportationに関するいくつかのドキュメントは、VBと同じ問題を持ってい.NE 関数が__stdcallなしで宣言されていても、マネージデバッグアシスタント 'PInvokeStackImbalance'という警告があった場合、この例外は発生しませんでした。ライブラリ関数で

は、DLLプロジェクト

EXPORT 
    GetLine 

に、リンカの追加オプションに

extern "C" _declspec(dllexport) 
int __stdcall GetLine(HWND hwnd, int iLine, TCHAR *buff) 

ADDE exports.defファイルを宣言

/DEF:"exports.def" 

問題が

関連する問題