现在的位置: 首页 > 综合 > 正文

通过反射动态加载对象

2013年06月11日 ⁄ 综合 ⁄ 共 1182字 ⁄ 字号 评论关闭

测试在以下几种情况下,通过反射加载一个对象需要什么样的类型信息:
1、加载同一程序集中的类型(TypeInSamAssembly)
2、加载引用程序集(CreateInstanceRef)中的类型(CreateInstanceRefType)
3、加载未引用程序集(CreateInstanceNotRef)中的类型(CreateInstanceNotRefType)

测试结果:
1、加载同一程序集中的类型(TypeInSamAssembly),用FullName或者AssemblyQualifiedName都可以
2、加载引用程序集(CreateInstanceRef)中的类型(CreateInstanceRefType),需要AssemblyQualifiedName
3、加载未引用程序集(CreateInstanceNotRef)中的类型(CreateInstanceNotRefType),需要AssemblyQualifiedName;且此程序集文件必须位于运行程序集的同一目录下
以上结果对已强名称或者非强名称的程序集都适用。在需要AssemblyQualifiedName的场合,强名称程序集要求类型信息必须同加载程序集的相同:Version,Culture,PublicKeyToken;非强名称程序集Version可以不同。

跨程序集的类型加载:
程序集文件必须位于运行程序集的同一目录下,或者设置专用路径,此专用路经是相对于运行程序集基目录的路径,且必须是基目录的子目录:
1、通过代码设置专用路径
AppDomain.CurrentDomain.AppendPrivatePath(ptah);
try
{
 Type type = Type.GetType(typeName);
}
finally
{
 AppDomain.CurrentDomain.ClearPrivatePath();
}
2、通过配置设置
<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin"/>
      </assemblyBinding>
   </runtime>
</configuration>

结论:动态加载类型使用Type.GetType()得到类型信息,静态加载可以用typeof()得到类型信息。加载不同程序集中的类型必须使用完全限定名AssemblyQualifiedName。如果只提供类型的FullName则指当前运行的Assembly;根据AssemblyQualifiedName按照“GAC、本地、私有路径、公有路径”的顺序搜索Assembly,然后动态地加入应用域中。

抱歉!评论已关闭.