无法投射通过反射创建的类

时间:2012-02-24 06:23:13

标签: c# reflection

我正在尝试从仅在运行时知道的程序集中创建一个类。有奇怪的问题。

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仍然是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())

有关为什么在普通代码流中不起作用的任何线索?

1 个答案:

答案 0 :(得分:3)

ILocationProvider在哪里宣布?我的猜测是你在通过反射加载的程序集中有一个副本,在“运行”程序集中有一个副本。那些是不同的接口。

基本上,您需要确保该接口仅加载到一个程序集中,并且只能加载到该程序集的一个副本中。

我在this article年前写过 - 对它的某些方面可能有更好的方法,但出现问题的基本原理可能仍然有效。