2012-02-24 52 views
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()); 

如果我使用调试器,并停止最后两行被执行之前,我可以运行在即时窗口,这两条线,和他们的工作。但是如果我让代码运行,locProvider仍然为空。

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在哪里申报?我的猜测是,你在通过反射加载的程序集中有一个副本,而在“运行”程序集中有一个副本。这些是不同的接口。

基本上,你需要确保该接口只加载一个装配,而且装配的只有一个副本

我写了this article年前 - 有些方面可能会有更好的方法,但是出现问题的基本原理可能仍然有效。

+0

就是这样。谢谢,乔恩! – 2012-02-24 06:38:39