C#非托管导出丢失方法异常 我试图复制C++中的C++库的功能,它的一个特点是它可以将一些函数暴露给外部。p>

C#非托管导出丢失方法异常 我试图复制C++中的C++库的功能,它的一个特点是它可以将一些函数暴露给外部。p>,c#,export,unmanaged,missingmethodexception,C#,Export,Unmanaged,Missingmethodexception,现在,当我调用SetAllAnalog()时,我得到了下面提到的异常。这实际上不是一个如何修复的问题,因为我可以将内部函数包装到另一个函数中,然后导出 虽然我想知道为什么会发生这种情况,以及是否有更好的方法来解决这个问题,而不是已经提到的解决方案 我有以下代码: [DllExport("OutputAllAnalog", CallingConvention = CallingConvention.StdCall)] public static void OutputAllAnal

现在,当我调用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()
    {

    }

是否尝试在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()
{

}
[DllExport(“outputallang”,CallingConvention=CallingConvention.StdCall)]
公共静态无效输出ALOGIMPLEMENTION(int Data1、int Data2)
{
如果(!_k8055D.Connected | | |数据1<0 | | 255
记录了6年前由类似方法名称引起的错误

链接到解释Nuget包处理的幕后魔法的链接


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

尚未尝试,但您的回答很有意义,我最终选择了简单的方法,使用了单独的方法导出功能并调用内部功能。
[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()
{

}