1

C# で C++ ライブラリの機能を複製しようとしていますが、その機能の 1 つは、その機能の一部を外部に公開できることです。

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 年前に同様のメソッド名が原因で発生したエラーを文書化しています。

この回答は、 UnmanagedExports Nuget パッケージによって処理される舞台裏の魔法を説明するCodeplex の記事にリンクしています。

この回答は、このトピックに関する多くの追加の参照を提供します。

于 2016-12-13T05:07:54.737 に答える