【发布时间】:2012-02-09 03:46:28
【问题描述】:
我有一个 DLL,其中包含带有方法的非托管类。我正在尝试从 C++/CLI 调用这些方法。
我的阅读使我发现 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 文章,但我不明白。
提前感谢您的帮助!
【问题讨论】:
-
非托管代码位于命名空间中的类中,但托管 C++ 代码没有周围的命名空间?可能是托管代码在 DLL 包含
MathFuncs::MyMathFuncs::Add时查找MyMathFuncs::Add的问题。 -
你为什么要从这里使用 P/invoke。 C++/CLI 的一个很好的特性是您可以在没有 P/invoke 的情况下链接到本机 DLL。
标签: c++ interop c++-cli pinvoke