1

我正在尝试在我的 c# 项目中使用自定义 VC++ dll。为此,我按照这篇文章创建了一个自定义。我能够在另一个 c++ 项目 ( MyExecRefsDLL.vcxproj ) 中创建 DLL、链接和调用。

现在,我的意图是在 C# 代码中使用相同的 DLL。因此,我创建了另一个 C# 控制台项目并尝试添加引用(通过右键单击 -> 添加引用 -> 选择项目“ MathFuncDLL ”),如上面链接中所建议的那样。我收到一条错误消息 - “无法添加对 'MathFuncDLL' 的引用”。

为了克服这个问题,我尝试使用项目模板 -> Visual C++ -> 类库为 VC++ dll 即MathFuncDLL2创建另一个项目。这次我可以在 C# 中引用该项目。现在在运行时从 DLL 调用方法时出现错误 - “EnteryPointNotFoundException 未处理”“无法在 DLL 'MathFuncDLL2.dll' 中找到名为 'Add' 的入口点。”

我创建了一个可以从此链接下载的示例。

任何帮助将不胜感激。

4

3 回答 3

1

我刚刚遇到了同样的问题。我所做的是将我的 VC++ DLL 项目的 Common Language Runtime Support 更改为Common Language Runtime Support (/clr)

右键单击项目 -> 属性 -> 常规 -> ProjectDefaults -> 公共语言运行时支持。

然后我能够添加对 C# 项目的引用。

于 2013-10-18T18:16:54.600 回答
1

您的问题可能是 C++ 在导出时修饰了函数名。因此,Add,实际上可能是@Add34ZZ

运行时dumpbin /exports MathFuncsDLL2.dll,返回的内容如下:

    ordinal hint RVA      name

          1    0 00001193 ?Add@MyMathFuncs@MathFuncs@@SANNN@Z = ?Add@MyMathFuncs
@MathFuncs@@SANNN@Z (public: static double __cdecl MathFuncs::MyMathFuncs::Add(d
ouble,double))
          2    1 000011A5 ?Divide@MyMathFuncs@MathFuncs@@SANNN@Z = ?Divide@MyMat
hFuncs@MathFuncs@@SANNN@Z (public: static double __cdecl MathFuncs::MyMathFuncs:
:Divide(double,double))
          3    2 0000119F ?Multiply@MyMathFuncs@MathFuncs@@SANNN@Z = ?Multiply@M
yMathFuncs@MathFuncs@@SANNN@Z (public: static double __cdecl MathFuncs::MyMathFu
ncs::Multiply(double,double))
          4    3 00001199 ?Subtract@MyMathFuncs@MathFuncs@@SANNN@Z = ?Subtract@M
yMathFuncs@MathFuncs@@SANNN@Z (public: static double __cdecl MathFuncs::MyMathFu
ncs::Subtract(double,double))

因此,可用的解决方案是:

  • 将您的函数声明为extern "C" __declspec(dllexport)(并删除命名空间)

  • dumpbin编译和使用时运行[DllImport("Math.dll", EntryPoint="?Add@MyMathFuncs@MathFuncs@@SANNN@Z")]如果这样做,请将 DllImport 声明更改为[DllImport("MathFuncDLL2.dll", EntryPoint="<functionName>", CallingConvention=CallingConvention.Cdecl)]. 好消息是:通话有效。坏消息是:它似乎返回了一个指向结果的指针。

于 2013-02-22T09:57:51.770 回答
0

使用 [DllImport] 可以从任何标准 dll 调用函数

阅读这篇文章

于 2013-02-22T09:25:38.213 回答