2012-02-09 11 views
1

メソッドを持つアンマネージクラスを含むDLLがあります。これらのメソッドをC++/CLIから呼び出そうとしています。C++/CLI - DLLで定義されたアンマネージ関数を呼び出す

私の読書は、P/Invokeがこれを行うために使用されていることを私に導きました。しかし、私はそれを動作させる方法を見つけることができないようです。 DLLで

は、以下のクラスが定義されている:

//Header: 
namespace MathFuncs 
{ 
    class MyMathFuncs 
    { 
    public: 
     static __declspec(dllexport) double Add(double a, double b); 
     static __declspec(dllexport) double Subtract(double a, double b); 
     static __declspec(dllexport) double Multiply(double a, double b); 
     static __declspec(dllexport) double Divide(double a, double b); 
    }; 
} 

//Source: 
namespace MathFuncs 
{ 
    double MyMathFuncs::Add(double a, double b) { 
     return a + b; 
    } 

    double MyMathFuncs::Subtract(double a, double b) { 
     return a - b; 
    } 

    double MyMathFuncs::Multiply(double a, double b) { 
     return a * b; 
    } 

    double MyMathFuncs::Divide(double a, double b) { 
     if (b == 0) { 
      throw new invalid_argument("b cannot be zero!"); 
     } 
     return a/b; 
    } 
} 

私が何を読んでから、次は私がその後、私のコードで呼び出すことができます私のC++/CLIのコードでメソッドを宣言する必要があります。

class MyMathFuncs { 
public: 
[DllImport("TestDLL.dll")] 
    static double Add(double a, double b); 
}; 

ここで、 "TestDLL.dll"は私のDLLです。

エラーは実行時に発生します。 DLL「TestDLL.dll」で「追加」というエントリポイントを見つけることができません。

私は間違っていますか?私はこれについてのMSDNの記事を読んだが、私はそれを理解していない。

ご協力いただきありがとうございます。

+0

アンマネージコードはネームスペースにあるクラスにありますが、管理されたC++コードには、周囲のネームスペースがありません。 DLLに 'MathFuncs :: MyMathFuncs :: Add'が含まれているときにマネージコードが' MyMathFuncs :: Add'を探すのは問題になるかもしれません。 –

+0

なぜこれからP/invokeを使用しますか? C++/CLIの優れた機能の1つは、P/invokeなしでネイティブDLLにリンクできることです。 –

答えて

1

ネイティブDLLのDEFファイルを作成しましたか?

DUMPBINも役立つかもしれません。 DLLがエクスポートしているものを参照してください:

+0

お返事ありがとうございます。リンク先のMSDNページによれば、__declspec(dllexport)キーワードが使用されている場合、DEFファイルは必要ありません。私はDumpbinで何をするのか分かりません。 – JonaGik

0

を解決しました。 DLLの関数のEntryPointをDllImport属性に含める必要があります。しかし、MSDNのドキュメントによると、EntryPointはDLL内の関数名になることができますが、これは私のためには機能しません。関数の順序番号を記述する必要があります。誰が私になぜこれがあるのか​​教えてもらえますか?

+0

名前のマングリングまたは名前の装飾のためです。依存関係ビューアのようなものでDLLのエクスポートされた名前を見てください。 LemonBeagleが明言と装飾を明示的に言及していれば、それは他の答えが得られるところですが、それはより良いでしょう。 –