0

できれば、それ以上のリフレクションを行わずに、クラスの他の場所で使用できるオブジェクトのインスタンスを作成したいと考えています。

オブジェクトを作成した後 (activator または constructorInfo のいずれかを使用して、両方の引数を読みましたが、たとえば、より短いものとして activator を使用しました) キャストする必要がありますが、これは機能しません。

例えば:

Server instance;

public void A()
{
    Assembly loaded = Assembly.LoadFrom("C:\Program Files\test2\Shared.dll");
    serverType = loaded.GetType("Server");
    object obj = Activator.CreateInstance(serverType, new [] { "test" });
    instance = (Server)obj;
}

public void B()
{
    instance.startServer();
}

これは例外を与えます:

    System.InvalidCastException: [A]Server cannot be cast to [B]Server. 
    Type A originates from 'Shared, Version=0.0.0.0, Culture=neutral,      
    PublicKeyToken=2a032d22a4688508' in the context 
    'LoadFrom' at location 'C:\Program Files\test1\Shared.dll'. 
    Type B originates from 'Shared, Version=0.0.0.0, Culture=neutral,
    PublicKeyToken=2a032d22a4688508' in the context 'Default' at location .
    'C:\Program Files\test2\Shared.dll'

スローされた例外の理由は理解していますが、必要なタイプ、つまり動的にロードされた dll からインスタンスをサーバーとしてキャストする方法はありますか?

4

1 に答える 1

0

この行で: タイプ Server の完全修飾名instance = (Server)obj;を指定する必要があります。

このコードを実行するアセンブリでは、おそらく別の型が存在Serverするため、コンパイラはローカルのものを選択して、このあいまいさを解決しようとします。次のように、アセンブリのクラスまたはその他の特定のServerクラスにキャストすることを指定する必要があります。test.dllNAMESPACE.TYPE_NAME

于 2013-07-22T14:09:18.377 に答える