我正在尝试在我的c#项目中使用自定义VC ++ dll。为此,我按照this文章创建了一个自定义。我能够在另一个c ++项目( MyExecRefsDLL.vcxproj )中创建DLL,链接和调用。
现在,我的意图是在C#代码中使用相同的DLL。因此,我创建了另一个C#控制台项目并尝试添加引用(通过右键单击 - >添加引用 - >选择项目“ MathFuncDLL ”)dll,如上面的链接所示。我收到一条错误消息 - “无法添加对'MathFuncDLL'的引用”。
为了解决这个问题,我尝试使用项目模板为VC ++ dll创建另一个项目,即 MathFuncDLL2 - > Visual C ++ - >班级图书馆。这次我能够在C#中引用该项目。现在在运行时从DLL调用方法时出现错误 - “EnteryPointNotFoundException未处理”“无法在DLL'MathFuncDLL2.dll'中找到名为'Add'的入口点。”
我已经创建了一个可以从此link下载的示例。
任何帮助都将受到高度赞赏。
答案 0 :(得分: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)]
。好消息是:通话有效。坏消息是:它似乎返回一个指向结果的指针。
答案 1 :(得分:1)
我遇到了同样的问题。 我所做的是将VC ++ DLL项目的公共语言运行时支持更改为公共语言运行时支持(/ clr)。
右键点击该项目 - &gt;属性 - &gt;一般 - &gt; ProjectDefaults - &gt;公共语言运行时支持。
然后我就可以添加对C#项目的引用。
答案 2 :(得分:0)
使用[DllImport]可以从任何标准dll调用函数