Type.GetType()与 typeof跨程序集反射

原博地址:http://www.cnblogs.com/hyl8218/archive/2010/02/19/1667440.html

上一篇的热更新还不够完善,所以另外查了下相关资料,准备做一个完整的热更新系统。

在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型。如果使用稍有不慎,就会产生运行时错误。例如使用Type.GetType("BNameSpace.ClassName")在程序集A.dll获取程序集B.dll中的类型,就会返回Null。

关于跨程序集的反射,有两点需要注意:

1、如果使用typeof,编译能通过,则跨程序集的反射一定可以正常运行。可以说,typeof是支持强类型的。比如

1 Type supType = typeof(BNameSpace.SubSpace.Class);

如果当前程序集没有添加对EnterpriseServerBase.dll的引用,则编译会报错。

2、如果使用Type.GetType来进行反射的话,情况就复杂些。这是因为Type.GetType是非强类型的。Type.GetType的参数是一个string为类型的完全限定名,如果当string表示的目标类型不在当前程序集中,则运行时Type.GetType会返回null。解决的办法是:首先加载目标程序集,然后再使用Assembly.GetType方法来获取类型。如

1 Assembly asmb = Assembly.LoadFrom("EnterpriseServerBase.dll") ;
2 Type supType = asmb.GetType("EnterpriseServerBase.DataAccess.IDBAccesser") ;

注意,当使用Type.GetType的时候,即使你添加了对EnterpriseServerBase.dll的引用,Type.GetType("EnterpriseServerBase.DataAccess.IDBAccesser")也会返回null,这是因为Type.GetType只会在当前程序集中进行类型搜索!

时间: 2024-10-10 01:29:25

Type.GetType()与 typeof跨程序集反射的相关文章

Type.GetType()在跨程序集反射时返回null的解决方法

在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用Type.GetType("BNameSpace.ClassName")在程序集A.dll获取程序集B.dll中的类型,就会返回Null. 关于跨程序集的反射,有两点需要注意: 1.如果使用typeof,编译能通过,则跨程序集的反射一定可以正常运行.可以说,typeof是支持强类型的.比如 1 Type supType = typeof(BNameSpace

Type.GetType()在跨程序集反射时返回null

在使用Type.GetType来进行反射的话,情况就复杂些.这是因为Type.GetType是非强类型的.Type.GetType的参数是一个string为类型的完全限定名, 如果在当前程序集中使用: var typeFullName = "CommonBizService.Test"; var type = Type.GetType(typeFullName ); 如果当string表示的目标类型不在当前程序集中,则运行时Type.GetType会返回null. 在网上 找了一些,也

c# 之 System.Type.GetType()与Object.GetType()与typeof比较

Object.GetType()与typeof的区别 //运算符,获得某一类型的 System.Type 对象. Type t = typeof(int); //方法,获取当前实例的类型. int i = 10; Console.WriteLine(i.GetType());//区别Typeof()是运算符而GetType是方法GetType()是基类System.Object的方法,因此只有建立一个实例之后才能被调用(也就是创建实例)Typeof()的参数只能是lint,string,类,且不

C# 反射 Type.GetType()

对于外部调用的动态库应用反射时要用到Assembly.LoadFile(),然后才是获取类型.执行方法等;当用反射创建当前程序集中对象实例或执行某个类下静态方法时只需通过Type.GetType("类的完整名"). Type.GetType(sClassPath,sAssembly) actually translates to Assembly.Load(sAssembly).GetType(sClassPath). 原文地址:https://www.cnblogs.com/sunn

Type.GetType()反射另外项目中的类时返回null的解决方法

项目1:ProjectA namespace ProjectA { public class paa { .... } } Type.GetType("paa")返回null Type.GetType("ProjectA.paa")返回正确 项目2:ProjectB 引用了ProjectA Type.GetType("ProjectA.paa")返回空值 Type.GetType("ProjectA.paa,ProjectA"

GetType() 和typeof() 的区别

GetType() 非强类型,支持跨程序集发射,用来支持动态引用, A obja=new A(); Type t=obja.GetType() typeof() 强类型,静态的 Type t=typeof(A)

Atitit.跨语言反射api 兼容性提升与增强 java c#。Net  php  js

Atitit.跨语言反射api 兼容性提升与增强 java c#.Net  php  js 1. 什么是反射1 1.1.       反射提供的主要功能:2 1.2.       实现反射的过程:2 2. 类反射中所必须的类: 的类反射所需要的类并不多,它们分别是:Field.Constructor.Method.Class.Object,2 3. . 反射的用处3 3.1. 可视化 3 3.2. 系统的灵活性.可扩展性 3 3.3. Json xml序列化3 3.4. 函数指针3 3.5. R

c#种GetType()和TypeOf()的区别

C#中任何对象都具有GetType()方法,它的作用和typeof()相同,返回Type类型的当前对象的类型. typeof(x)中的x,必须是具体的类名.类型名称等,不可以是变量名称:GetType()是基类System.Object的方法,因此只有建立一个实例之后才能够被调用. Typeof的参数只能是int,string,String,自定义类型,且不能是实例 GetType()和typeof都返回System.Type的引用. TypeOf():得到一个Class的Type GetTyp

C# GetType和typeof的区别

typeof: The typeof operator is used to obtain the System.Type object for a type. 运算符,获得某一类型的 System.Type 对象. Type t = typeof(int); GetType: Gets the Type of the current instance.             方法,获取当前实例的类型.              int i = 10;Console.WriteLine(i.G