2016-12-07 14 views
1

C#でのライブラリの機能を複製しようとしていますが、その機能の一部は外部にいくつかの機能を公開することができます。C#で管理されていないエクスポートMissingMethodException

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

} 

This questionは6年前に同様のメソッド名による誤差を説明します。

This answerは、UnmanagedExports Nugetパッケージで処理される舞台裏の魔法を説明するCodeplex articleへのリンクです。

This answerには、このトピックに関する追加の参考文献が多数提供されています。

+0

まだ試したことはありませんが、答えが分かりやすいので、簡単なルートになり、機能をエクスポートして内部メソッドを呼び出す別のメソッドを使用するだけです。 – Encore

関連する問題