C# Неуправляемый экспорт MissingMethodException

Я пытаюсь воспроизвести функциональность библиотеки 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)'.

1 ответ

Вы пытались использовать разные имена для функции в атрибуте ExportName атрибута DllExport в сравнении с фактическим именем функции? Все примеры, которые я видел, были сделаны таким образом, например:

[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, в которой объясняется скрытое волшебство, обрабатываемое пакетом UngetagedExports Nuget.

Этот ответ содержит ряд дополнительных ссылок на эту тему.

Другие вопросы по тегам