我试图在C#中复制C ++库的功能,其中一个功能是它可以将一些功能暴露给外部。
现在,当我调用SetAllAnalog()时,我得到了下面提到的异常。这不是一个问题如何修复它,因为我可以将内部函数包装在另一个函数中然后导出。
虽然我想知道为什么会发生这种情况,并且除了已经提到的解决方案之外,还有更好的解决方法。
我有以下代码:
[DllExport("OutputAllAnalog", CallingConvention = CallingConvention.StdCall)]
public static void OutputAllAnalog(int Data1, int Data2)
{
if (!_k8055D.Connected || Data1 < 0 || 255 < Data1 ||
Data2 < 0 || 255 < Data2) return;
_k8055D.AnalogOutputChannel[0] = (double)Data1 / 255 * 5;
_k8055D.AnalogOutputChannel[1] = (double)Data2 / 255 * 5;
}
[DllExport("SetAllAnalog", CallingConvention = CallingConvention.StdCall)]
public static void SetAllAnalog()
{
OutputAllAnalog(255, 255); //exception
test(); //No exception
}
public static void test()
{
}
例外:
An unhandled exception of type 'System.MissingMethodException' occurred in K8055Test.exe
Additional information: Method not found: 'Void K8055Simulation.K8055.OutputAllAnalog(Int32, Int32)'.
答案 0 :(得分:1)
您是否尝试在DllExport属性ExportName参数中使用不同的名称与函数的实际名称?我看到的所有例子都是这样做的,例如:
[DllExport("OutputAllAnalog", CallingConvention = CallingConvention.StdCall)]
public static void OutputAllAnalogImplementation(int Data1, int Data2)
{
if (!_k8055D.Connected || Data1 < 0 || 255 < Data1 ||
Data2 < 0 || 255 < Data2) return;
_k8055D.AnalogOutputChannel[0] = (double)Data1 / 255 * 5;
_k8055D.AnalogOutputChannel[1] = (double)Data2 / 255 * 5;
}
[DllExport("SetAllAnalog", CallingConvention = CallingConvention.StdCall)]
public static void SetAllAnalog()
{
OutputAllAnalogImplementation(255, 255); //Fixed exception??
test(); //No exception
}
public static void test()
{
}
This question记录了6年前由类似方法名称引起的错误。
This answer链接到Codeplex article,解释UnmanagedExports Nuget包处理的幕后魔法。
This answer提供了有关此主题的一些其他参考资料。