C# 无法转换通过反射创建的类
我试图从仅在运行时已知的程序集创建一个类。有奇怪的问题C# 无法转换通过反射创建的类,c#,reflection,C#,Reflection,我试图从仅在运行时已知的程序集创建一个类。有奇怪的问题 string providerType = AppConfig.GetConfigValue("LocationProvider"); string assemblyFileName = AppConfig.GetConfigValue("LocationProviderAssembly"); Assembly assembly = Assembly.LoadFrom(assemblyFileName); //Object obj = a
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())
关于为什么这在正常代码流中不起作用的任何线索?在哪里声明了
ILocationProvider
?我的猜测是,通过反射加载的程序集中有一个副本,在“正在运行”的程序集中有一个副本。这些是不同的接口
基本上,您需要确保接口只加载在一个程序集中,并且也只加载在该程序集的一个副本中
我在几年前写过——也许有更好的方法来解决它的某些方面,但出错的基本原理可能仍然有效