visual c++-如何在c#中使用自定义VC++dll

本文关键字:自定义 VC++dll c++- visual | 更新日期: 2023-09-27 18:00:35

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

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

为了解决这个问题,我尝试使用项目模板->Visual C++->类库为VC++dll创建另一个项目,即MathFuncDLL2。这一次我可以参考C#中的项目。现在在运行时,我从DLL调用方法时遇到错误-"EnteryPointNotFoundException未处理"在DLL"MathFuncDLL2.DLL"中找不到名为"Add"的入口点。"

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

如有任何帮助,我们将不胜感激。

visual c++-如何在c#中使用自定义VC++dll

您的问题可能是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)(并删除名称空间)

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

我刚刚遇到了同样的问题。我所做的是将我的VC++DLL项目的公共语言运行时支持更改为公共语言运行时间支持(/clr)

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

然后我可以添加对C#项目的引用。

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

阅读本文