2012-02-09 81 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'中找到名爲'Add'的入口點」。

我在做什麼錯?我已閱讀了關於此的MSDN文章,但我不明白。

在此先感謝您的幫助!

+0

非託管代碼位於名稱空間中的類中,但託管C++代碼中沒有名稱空間?可能是託管代碼在DLL包含「MathFuncs :: MyMathFuncs :: Add」時查找「MyMathFuncs :: Add」的問題。 – 2012-02-09 06:51:59

+0

你爲什麼要用P/invoke從這個。 C++/CLI的一個很好的特性就是你可以鏈接到沒有P/invoke的本地DLL。 – 2012-02-09 10:55:30

回答

1
+0

感謝您的回覆。根據您鏈接到的MSDN頁面,如果使用__declspec(dllexport)關鍵字,則不需要DEF文件。我不確定我會用Dumpbin做什麼。 – JonaGik 2012-02-09 04:49:56

0

解決。我需要在DllImport屬性的DLL中包含該函數的EntryPoint。但是,MSDN文檔建議EntryPoint可以是DLL中的函數名稱,但這不適用於我 - 我必須聲明該函數的序號。任何人都可以讓我知道這是爲什麼?

+0

由於名稱改變或名稱裝飾。在Dependency Viewer等東西中查看DLL的導出名稱。這就是另一個答案,但如果LemonBeagle明確提到了裝飾和裝飾,那本來會更好。 – 2012-02-09 10:53:47