关于跨程序集的反射(续)

    以前曾写过一篇“关于跨程序集的反射”的blog,关于跨程序集加载类型,文中使用的是方法是:先加载目标类型所在的程序集,再使用Assembly. GetType方法获取类型。文后Luna兄的评论说,可以直接使用Type.GetType("<<完全限定类名>>,<<程序集>>")来加载类型,当初我查了MSDN,MSDN中也说到了这一点,我也就记住了这个解决方案。但是,今天使用这种方式来跨程序集进行类型加载时,却始终返回null。难道MSDN有误?我不知道。(还望知道的仁兄告知,呵呵)。

    在Spring.net中,配置文件中,通常出现类似下面的配置项:

<object name="dataStreamHelper" type="DataCenterBase.Common.DataStreamHelper ,DataCenterBase"/>

    配置中的“type”的值正好与Type.GetType方法的参数格式完全一致,于是我猜想Spring.net是使用了Type.GetType方法。我查看了Spring.net这块的源代码,出乎意料的是Spring.net并没有使用Type.GetType这个捷径,而仍然使用了Assembly.GetType方法。也不知道为什么,呵呵

    为了以后使用方便,我自己封装了一个静态方法,来支持任意类型的加载。

 1         #region GetType
 2         // assemblyName 不用带扩展名 ,如果目标类型在当前程序集中,assemblyName传入null    
 3         public static Type GetType(string typeFullName ,string assemblyName)
 4         {
 5             if(assemblyName == null)
 6             {
 7                 return Type.GetType(typeFullName) ;
 8             }
 9 
10             //搜索当前域中已加载的程序集
11             Assembly[] asses = AppDomain.CurrentDomain.GetAssemblies();
12             foreach (Assembly ass in asses)
13             {
14                 string[] names = ass.FullName.Split(',') ;
15                 if(names[0].Trim() == assemblyName.Trim())
16                 {
17                     return ass.GetType(typeFullName) ;
18                 }
19             }
20 
21             //加载目标程序集
22             Assembly tarAssem = Assembly.LoadWithPartialName(assemblyName) ;
23             if(tarAssem != null)
24             {
25                 return tarAssem.GetType(typeFullName) ;
26             }
27 
28             return null ;
29         }
30         #endregion

    关于使用Type.GetType加载非当前程序集中的类型,谁有成功的经验了?感谢分享下。
    
   

时间: 2024-09-20 11:35:24

关于跨程序集的反射(续)的相关文章

关于跨程序集的反射

    在开发中,经常会遇到这种情况,在A.dll中需要反射B.dll中的类型,如果稍不注意,就会产生运行时错误.关于跨程序集的反射,记住两点就可以:(1)如果使用typeof,编译能通过,则跨程序集的反射一定可以正常运行.可以说,typeof是支持强类型的.比如 Type supType = typeof(EnterpriseServerBase.DataAccess.IDBAccesser) ;     如果当前程序集没有添加对EnterpriseServerBase.dll的引用,则编译会

ASP.NET AutoFac 依赖注入问题(跨程序集注入问题)

问题描述 示例一:我一个接口publicinterfaceITest{stringDisplay();}publicclassTestRepository:ITest{publicstringDisplay(){return"AutoFac"}}publicclassHomeController{privateITesttest=null;publicHomeController(ITest_test){this.test=_test;}}通过Global.asax.cs文件实现依赖注

软件开发-关于c#的特性,反射,委托与回调方法的问题

问题描述 关于c#的特性,反射,委托与回调方法的问题 1.c#的特性用来有什么用?难道只是为了用反射来检索?但是我看的书上用反射检索出特性也没用来干什么,求解 2.反射,我的理解是可以加载了一个程序集之后获取其中定义的类型,并用其中定义的类型创建对象,使用其属性,字段,方法.这样是不是可以跨程序获取变量(或者说,跨程序集是不是即跨程序,打个比方,若获取了microsoft word的程序代码,金山的wps也可以在代码中加载word的程序并获取和使用其中定义的方法?) 3.回调方法是不是都要通过委

C# 反射 通过类名创建类实例

"反射"其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载程序集(EXE 或 DLL) object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间

c#中的反射

目录 反射的概述 反射appDomain 的程序集 反射单个程序集 利用反射获取类型信息 设置反射类型的成员 通过反射创建类型的实例 反射类型的接口 反射的性能 反射的概述 反射的定义:审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等,.System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码 和反射相关的命名空间(我们就是通过这几个命

“前.NET Core时代”如何实现跨平台代码重用 ——程序集重用

除了在源代码层面实现共享("前.NET Core时代"如何实现跨平台代码重用 --源文件重用)之外,我们还可以跨平台共享同一个程序集,这种独立于具体平台的"中性"程序集通过创建一种名为"可移植类库(PCL: Portable Class Library)"项目来实现.为了让读者朋友们对PCL的实现机制具有充分的认识,我们先来讨论一个被我称为"程序集动态绑定"的话题. 目录 一.何谓程序集动态绑定? 二.程序集一致性 三.程序集

C# 反射技术应用

反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌.如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道. 1..NET可执行应用程序结构 程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构. 应用程序结构分为应用程序域-程序集-模块-类型-成员

《ADOBE INDESIGN CS6标准培训教材》—第2章2.4节页面和跨页

2.4 页面和跨页 ADOBE INDESIGN CS6标准培训教材 在"文件>页面设置"对话框中选择"对页"选项时,文档页面将排列为跨页.跨页是一组一同显示的页面,例如在打开书籍或杂志时看到的两个页面.每个 InDesign 跨页都包括自己的粘贴板.粘贴板是页面外的区域,您可以在该区域存储还没有放置到页面上的对象.每个跨页的粘贴板都可提供用以容纳对象出血或扩展到页面边缘外的空间. 2.4.1 页面面板 "页面"面板如图2-4-1所示,它主

框架升级后某个类型所在程序集发生转移,应用还能正常运行吗?

所谓类型转移(Type Forwarding)就是将定义在某个程序集中的类型转移到另一个程序集中.我们先通过一个简单的实例让读者朋友们对类型转移有一个感官上的认识.我们利用Visual Studio创建一个针对.NET Framework 3.5的控制台应用,并编写如下一端简单的程序输出两个常用的类型(Function<T>和TimeZoneInfo)所在程序集的名称.现在我们直接运行这个程序,会在控制台上得到如下所示的输出结果,可以看出.NET Framework 3.5(CLR 2.0)环