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"的入口点。"
我已经创建了一个可以从这个链接下载的示例。
如有任何帮助,我们将不胜感激。
您的问题可能是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 调用函数
阅读本文