在开发中,经常会遇到这种情况,在A.dll中需要反射B.dll中的类型,如果稍不注意,就会产生运行时错误。关于跨程序集的反射,记住两点就可以:
(1)如果使用typeof,编译能通过,则跨程序集的反射一定可以正常运行。可以说,typeof是支持强类型的。比如
Type supType = typeof(EnterpriseServerBase.DataAccess.IDBAccesser) ;
如果当前程序集没有添加对EnterpriseServerBase.dll的引用,则编译会报错。
(2)如果使用Type.GetType,情况就复杂些,这是因为Type.GetType是非强类型的。Type.GetType的参数是一个string,当string表示的目标类型不在当前程序集中,则运行时Type.GetType会返回null。解决的办法是:首先加载目标程序集,然后再使用Assembly.GetType方法。如
Assembly asmb = Assembly.LoadFrom("EnterpriseServerBase.dll") ;
Type supType = asmb.GetType("EnterpriseServerBase.DataAccess.IDBAccesser") ;
注意,当使用Type.GetType的时候,即使你添加了对EnterpriseServerBase.dll的引用,Type.GetType("EnterpriseServerBase.DataAccess.IDBAccesser")也会返回null,这是因为Type.GetType只会在当前程序集中进行类型搜索!
2个dll:a.dll,b.dll
如果 a要实例化 a中的一个对象 那么 Type.GetType(命名空间+类名) 就可以了.
如果a 中要实例化 b中的一个实例. 就没有那么简单了.
先要 进入 b的程序集.在去实例化.....
Type.GetType(ToReturn + "," + _MVCModelDll);
MVCModelDll:dll名称(不包括".dll")
ToReturn :命名空间和类名
如:Type type = Type.GetType("TestDLL.TestClass, TestDLL");
如果知道dll的名称就可以直接调用了.
如果不知道,就遍历的方式.
用遍历的方式
Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies();//获取已经加载的所有程序集
foreach (Assembly assembly in ass)
{
if (string.IsNullOrEmpty(assembly.Location))
break;
string filename = System.IO.Path.GetFileName(assembly.Location);
string dolast = System.IO.Path.GetExtension(filename);
string _MVCModelDll = filename.Replace(dolast, "");
object basehelpertype = Type.GetType(ToReturn + "," + _MVCModelDll);
if (basehelpertype != null)//如果构建成功那肯定就是对的了...
break;
}
typeof 与 type.gettype区别:
1.
typeof:
用于获取类型的 system.type 对象。typeof 表达式采用以下形式:
system.type type = typeof(int);
gettype:
若要获取表达式的运行时类型,可以使用 .net framework 方法 gettype,如下所示:
int i = 0;
system.type type = i.gettype();
2.
a.gettype() 这个a是对象
typeof()是运算符而gettype是方法
gettype()是基类system.object的方法,因此只有建立一个实例之后才能够被调用(初始化以后)
typeof()的参数只能是int,string,string,自定义类型,且不能是实例
实例化
Assembly asmb = Assembly.LoadFrom("TestDLL.dll");
object intance = asmb.CreateInstance("TestDLL.TestClass");