2016-04-22 19 views
0

私はFortranから呼び出せるC++/CLI関数を書いています。C++/CLIから未完成のC++関数を呼び出す方法

extern "C" 
{ 
    void __declspec(dllexport) __cdecl someFunct(int val) 
    { 
     ... 
    } 
} 

このように指定されています。マネージドコードを呼び出すと、インテルVisual Fortranから呼び出すことができます。 DLLをダンプすると、_someFunctとしてエクスポートされていることがわかります

ここで別のC++/CLI DLLからこの関数を呼び出したいと思います。これは、リンカが期待するようだ

Error 4 error LNK2028: unresolved token (0A00000A) "extern "C" void __cdecl someFunct(int)" ([email protected]@[email protected]) referenced in function "public: void __clrcall NUnitTesting::Class1::Test(void)" ([email protected]@[email protected]@$$FQ$AAMXXZ) 

:私が取得エラーメッセージはこれです

extern "C" extern __declspec(dllimport) void __cdecl someFunct(int val); 

:私は(先頭にアンダースコア付きとなし)以下の仕様を試してみたが、両方とも同じように失敗しますたとえ私が仕様にextern "C"を指定したとしても、装飾された名前です。私はどのようにして名前を飾らないように強制することができますか?

+0

それはあなたが実際にC++の名前の装飾と機能を呼び出している、それが見えるだけの方法です。管理されていないコードの実行から管理されていないコードの実行に移行し、someFunct()を呼び出すのは** thunk **のコードです。サンクはリンカーによって生成されます。しかし、それは起こらなかった、DLLのインポートライブラリをリンクするのを忘れたので、リンカはsomeFunctの定義を見つけることができなかった。だからサンクも生成されませんでした。 [DllImport]を使うことは本当の代理ではありません。 –

答えて

0

それを実演しました。私のスペックは、DLLの名前が付け加えなければなりません:

using namespace System::Runtime::InteropServices; 

[DllImport("DLL_with_someFunct",CallingConvention=CallingConvention::Cdecl)] 
extern "C" extern void __cdecl someFunct(int val); 
関連する問題