如何在C#中使用自定义VC ++ dll

时间:2013-02-22 06:33:29

标签: c# visual-c++ clr pinvoke

我正在尝试在我的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下载的示例。

任何帮助都将受到高度赞赏。

3 个答案:

答案 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调用函数

阅读this article