1

我正在尝试在 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)'.
4

1 回答 1

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()
{

}

这个问题记录了 6 年前由类似方法名称引起的错误。

此答案链接到Codeplex 文章,该文章解释了UnmanagedExports Nuget 包处理的幕后魔法。

该答案提供了有关此主题的许多其他参考。

于 2016-12-13T05:07:54.737 回答