2012-02-09 53 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