2

データダンプを行うexeファイルがあります。exeは、構成に基づいてDLLを動的に取得し、クラスオブジェクトを渡します。DLLには、このクラスのコピーがコンパイルされており、デバッグ中のデータをオブジェクトとして問題なく表示できます。しかし、それをクラスにキャストしようとすると、コンテキストが原因でキャストできないと表示されます。私は時々それをしているので、私は何かを見落としていると確信しています。

エラー:

[A]MyClassを[B]MyClassにキャストすることはできません。タイプAは、場所「C:\ MyPath \MyExe.exe」のコンテキスト「デフォルト」の「MyExe、Version = 1.0.0.0、Culture = neutral、PublicKeyToken=null」に由来します。タイプBは、場所「C:\ MyPath \MyDLL.dll」のコンテキスト「LoadNether」の「MyDLL、Version = 1.0.0.0、Culture = neutral、PublicKeyToken=null」に由来します。

EXEコード:

Object[] param = new Object[] { MyClass };
MethodInfo m = type.GetMethod("MyMethod");
reader = (SqlDataReader)m.Invoke(obj, param);

DLLコード:

public SqlDataReader MyMethod(Object param)
{
    SqlDataReader reader = new SqlDataReader();
    Type t = param.GetType();  //Returns MyClass

    if (param is MyClass)      //Returns false
        reportItem = (MyClass)param; //Never executes

    MyClass reportItem = (MyClass)param; //InvalidCastException

    //other code here, pulling data
    return reader;
}
4

1 に答える 1

3

DLL には、コンパイルされたこのクラスのコピーがあります。

そんなことはしないでください、基本的に。型は1 つのアセンブリに含める必要があり、アセンブリは 1 つだけにする必要があります。CLR に関する限り、これらはまったく異なる型です。

おそらく、プラグインとアプリケーションの両方が参照できる共通のライブラリが必要になるでしょう。または、プラグインがアプリケーションの実行可能ファイルを参照し、そこに型を保持するようにすることもできます。

于 2013-03-14T14:53:22.013 に答える