频道栏目
读书频道 > web开发 > .NET > .NET安全揭秘
2.2.1 反射程序集
2012-10-24 15:25:55     我来说两句
收藏   我要投稿

本文所属图书 > .NET安全揭秘

全书共分为五个部分。第一部分:.NET安全基础,透彻讲解了.NET体系结构、程序集与反射、应用程序域和CLR寄宿等核心技术,这部分内容是.NET架构的核心,同时也是理解.NET底层安全机制的基础;第二部分:.NET平台安...  立即去当当网订购

这里要明确“应用程序域”的概念(第3章会详细解释),现在只要知道:一个应用程序域可包含一个或多个程序集,每个程序集必须要先加载到应用程序域里才能运行。第一步要做的是获取应用程序域中的程序集。如代码清单2-5所示。

代码清单2-5获取应用程序域中的程序集

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace 反射
{
class Program
{
static void Main(string[] args)
{
foreach (Assembly ab in AppDomain.CurrentDomain.GetAssemblies())
{
Console.WriteLine(ab.FullName);
}
Console.ReadKey();
}
}
}

上述代码使用AppDomain.CurrentDomain.GetAssemblies()获取当前程序域中加载的所有程序集,然后输出程序集的全名称。输出结果如代码清单2-6所示。

代码清单2-6输出结果

mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Microsoft.VisualStudio.HostingProcess.Utilities, Version=10.0.0.0, Culture=neutr
al, PublicKeyToken=b03f5f7f11d50a3a
System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561
934e089
System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3
a
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Microsoft.VisualStudio.HostingProcess.Utilities.Sync, Version=10.0.0.0, Culture=
neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.VisualStudio.Debugger.Runtime, Version=10.0.0.0, Culture=neutral, Publ
icKeyToken=b03f5f7f11d50a3a
vshost32, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e0
89
System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=
b77a5c561934e089
Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50
a3a
System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
反射, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

说明 AppDomain的CreateDomain方法可以创建一个应用程序域,相关内容将在第3章中介绍。

获取程序集之后,下一步要做的是反射获取的程序集中的模块。修改代码清单2-5,如代码清单2-7所示。

代码清单2-7反射程序集中的模块

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace 反射
{
class Program
{
static void Main(string[] args)
{
foreach (Assembly ab in AppDomain.CurrentDomain.GetAssemblies())
{
OutModule(ab);
}
Console.ReadKey();
}
private static void OutModule(Assembly ab)
{
foreach (Module md in ab.GetModules())
{
Console.WriteLine(ab);
Console.WriteLine(md.Name);
Console.WriteLine();
}
}
}
}

在方法OutModule(Assembly)中,输出每个程序集的模块,Assembly类的GetModules方法返回每个程序集的模块,不分输出结果如图2-15所示。


 

模块已经获得了,下一步要做的是获得模块里的类型,为此要添加OutTypes方法,遍历每个模块的类型,如代码清单2-8 所示。

代码清单2-8遍历每个模块的类型

  private static void OutTypes(Module md)
{
foreach (Type t in md.GetTypes())
{
Console.WriteLine(t);
}
}

输出结果太长,这里就不展示了。继续深入反射之路,学习反射类型的方法。在源代码中添加方法OutMethods,如代码清单2-9 所示。

代码清单2-9反射类型的方法

private static void OutMethods(Type t)
{
foreach (MemberInfo mi in t.GetMethods())
{
Console.WriteLine(mi.Name);
}
}
t.GetMembers()

此外,可以使用t.GetMembers()获得所有成员信息,还有其他方法获得属性、字段,这里就不一一列举了。

注意 Type类的Get***类型的方法都有两个版本,无参数的版本是不能获得非公有成员的,有参数的版本须指定BindingFlags枚举的一个值,用来说明要获取成员的访问类型。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:2.2 使用反射操作程序集
下一篇:2.2.2 加载和卸载程序集
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站