【问题标题】:C++/CLI - Calling an Unmanaged Function Defined in a DLLC++/CLI - 调用在 DLL 中定义的非托管函数
【发布时间】: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


【解决方案1】:

【讨论】:

  • 感谢您的回复。根据您链接到的 MSDN 页面,如果使用 __declspec(dllexport) 关键字,则不需要 DEF 文件。我不确定我会用 Dumpbin 做什么。
【解决方案2】:

解决了。我需要在 DllImport 属性的 DLL 中包含函数的 EntryPoint。但是,MSDN 文档建议 EntryPoint 可以是 DLL 中的函数名,但这对我不起作用——我必须说明函数的序号。谁能告诉我这是为什么?

【讨论】:

  • 因为名称修改或名称修饰。在 Dependency Viewer 中查看导出的 DLL 名称。这就是另一个答案的意思,但如果 LemonBeagle 明确提到修饰和装饰会更好。
猜你喜欢
  • 2021-12-06
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多