2012-04-05 6 views
3

を投げ、私のアセンブリの一つは、以下の「プロバイダの種類が含まれていますはInvalidCastExceptionが

InheritanceTree

私もDeviceInfoProvider基本クラスを使用して、プロバイダ情報を保持しているXMLファイルを持っています。簡易版は、次のようになります。実行時に

<DeviceInfoProvider Type="SbRioI2CProvider" Assembly="assembly.dll" > 
</DeviceInfoProvider> 
<DeviceInfoProvider Type="GenericProvider" Assembly="assembly.dll" > 
</DeviceInfoProvider> 

、私は私の変数にXMLフィールドをマップ:

assembly.dll ⇒ assemblyPath 
Type   ⇒ typeName 

そしてXMLを読んだ後、私のタイプをインスタンス化するために、次のコードを使用します。

var assembly = Assembly.LoadFrom(assemblyPath); 

var type = (from t in assembly.GetTypes() 
      where t.IsPublic && t.Name == typeName 
      select t).FirstOrDefault(); 

if (type != null) 
{ 
    instance = type.GetConstructor(Type.EmptyTypes).Invoke(null); 
} 

これは予想通り、私のオブジェクトを適切に生成します。私は、基本クラスオブジェクトとしてインスタンスをキャストしようとすると、

問題が来る:instance

using (var provider = instance as DeviceInfoProvider) 
{ 
    // provider is null! 
} 

実行時の型が期待される派生クラスで、まだ私は成功し、その基本型にキャストすることができません。

私には何が欠けていますか?

+0

変数 'typeName'の値は何ですか? XMLまたはconst文字列値 "DeviceInfoProvider"から読み込みますか? – llj098

+0

はすべて同じアセンブリ内のこれらのタイプですか? –

+0

@mikez:XMLからロードされた型はすべて同じアセンブリ内にある必要はありません –

答えて

2

あなたの問題は、あなたがLoadFromコンテキストでassembly.dllで型からインスタンス(GenericProvider、SbRioI2CProvider)を作成していることかもしれません。次に、そのアセンブリ内の型(DeviceInfoProvider)に名前でキャストしようとしています。これは、暗黙的にLoadコンテキストを使用します。同じアセンブリからの型は異なるコンテキストで読み込まれた型は、ランタイムによって異なる型とみなされるため、キャストは失敗し、nullを返します。 Thisの記事では、アセンブリバインディングのコンテキストについての追加の説明があります。

このキャストを成功させるには、ロードコンテキストにLoadFromコンテキストでロードされたAssemblyを取得する必要があります。これを行うにはいくつかの方法があります。 1つの方法は、アセンブリをGACに入れることです。もう一つは、アプリケーションベースからassembly.dllを削除して、プロービングによって見つからないようにすることです。次に、AppFrame.AssemblyResolveイベントを使用して、LoadFrom経由で取得したAssemblyをロードします。

+0

説明とリンクをありがとう。アセンブリに強い名前を付けることがトリックでした! –

0

反射型のコンストラクタを呼び出しても、そのインスタンスは作成されません。

反射型のインスタンスを作成するには、Activator.CreateInstanceを呼び出します。

この行があるべきように見えます:

if (type != null) { 
    instance = Activator.CreateInstance(type) 
} 

これはinstanceはタイプobjectであることになりますが、今あなたが好きにキャストすることができます。

参照:http://msdn.microsoft.com/en-us/library/wccyzw83.aspx

+0

'Invoke'メソッドの戻り値は何ですか? – llj098

+0

あなたは私を持っています。 http://msdn.microsoft。com/en-us/library/6ycw1y17.aspx 'コンストラクタに関連付けられたクラスのインスタンス'。私は前にそのように作成された反射型のインスタンスを見たことがありません。 –

+0

Linq式をさらにフィルタリングして 'DeviceInfoProvider'から派生しない型を整理すると、探しているのと同じ型が得られますか? –

関連する問題