2012-02-24 4 views
2

実行時にしかわかっていないアセンブリからクラスを作成しようとしています。奇妙な問題を抱えている。私は、デバッガを使用し、最後の2行が実行される前に停止した場合リフレクションで作成したクラスのキャストに問題があります

string providerType = AppConfig.GetConfigValue("LocationProvider"); 
string assemblyFileName = AppConfig.GetConfigValue("LocationProviderAssembly"); 
Assembly assembly = Assembly.LoadFrom(assemblyFileName); 

//Object obj = assembly.CreateInstance(providerType) ; 
Type type = assembly.GetType(providerType); 
Object obj = Activator.CreateInstance(type); 

ILocationProvider locProvider = obj as ILocationProvider; 
float distance = locProvider.GetDistance(new Location(), new Location()); 

、私は、イミディエイトウィンドウでこれらの2つの行を実行することができ、そして彼らが働きます。しかし、コードを実行させると、locProviderはnullのままです。

objが右のタイプがあるようです:

obj.GetType() 
{Name = "LocationProviderConcrete" FullName = "LocationProvider.LocationProviderConcrete"} 
    [System.RuntimeType]: {Name = "LocationProviderConcrete" FullName = "LocationProvider.LocationProviderConcrete"} 
    base {System.Reflection.MemberInfo}: {Name = "LocationProviderConcrete" FullName = "LocationProvider.LocationProviderConcrete"} 

をそして、これは、イミディエイトウィンドウで正常に動作します:これは、通常のコードフローでは動作しない理由として

((ILocationProvider) obj).GetDistance(new Location(), new Location()) 

任意の手掛かり?

答えて

3

ILocationProviderはどこですか?私の推測では、リフレクションによってロードしているアセンブリに1つのコピーがあり、「実行中」のアセンブリに1つのコピーがあることです。それらは異なるインターフェースです。

は基本的には、インターフェイスだけあまりにもアセンブリにロードされ、そのアセンブリのだけで1つのコピーされていることを確認する必要があります。

私はthis article年前に書きました - それのいくつかの側面にはより良いアプローチがあるかもしれませんが、何が起こっているのかの基本はおそらくまだ有効です。

+0

それでした。ありがとう、ジョン! –

関連する問題