您的问题可能是 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)]
. 好消息是:通话有效。坏消息是:它似乎返回了一个指向结果的指针。