C#中的Assembly类

Assembly表示一个程序集,我们对它的使用,首先要加载对应的Assembly实例,本程序集也好,其他程序集也好,再者用获取的实例来获取程序集的信息或者构建一些类型的实例,在继续讨论我们需要明白下面的关系
(1)  AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器 
(2)  Assembly:程序集类 
(3)  Module:模块类  

(4)  Type:使用反射得到类型信息的最核心的类  

他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type,再者一个应用程序可以包含多个AppDomain,当程序跑起来后,对应的进程也可以创建多个appdomain,实现隔离,一个appdomain是不允许直接调用同一个进程中另一个appdomain的类型的,不同进程更不用说啦

再者我们在解决方案中新建两个控制台程序和一个类库,命名为,ClassLibrary1,ConsoleApplication2,ConsoleApplication3,我们对ConsoleApplication2和ClassLibrary1不做任何修改,并引入到ConsoleApplication3中,下面的代码都是写在ConsoleApplication3的main方法中,
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("************基本信息******************");
            Assembly assembly = Assembly.GetEntryAssembly();//获取默认应用程序域中的进程可执行文件
            Console.WriteLine(assembly.FullName);//程序集全名
            assembly = Assembly.GetExecutingAssembly(); // 获取包含当前执行的代码的程序集
            Console.WriteLine(assembly.CodeBase);//获取最初指定的程序集的位置
            Console.WriteLine(assembly.EntryPoint.Name);//程序入口点名字
            Console.WriteLine(assembly.FullName);//程序集全名
            Console.WriteLine(assembly.ImageRuntimeVersion);//公共语言运行时 (CLR) 的版本
            Console.WriteLine(assembly.Location);//程序集的完整路径
            Console.WriteLine(assembly.ManifestModule);//主module
            Console.WriteLine(assembly.GetName());//程序集全名
            Console.WriteLine("************程序集文件******************");
            //获取程序集清单文件表中的文件,可以指定是否包括资源模块
            FileStream[] fileStreams = assembly.GetFiles();
            foreach (FileStream fileStream in fileStreams)
            {
                Console.WriteLine(fileStream.Name);
            }
            Console.WriteLine("************程序集资源******************");
            //此程序集中的所有资源的名称
            string[] names = assembly.GetManifestResourceNames();
            foreach (var name in names)
            {
                ManifestResourceInfo manifestResourceInfo = assembly.GetManifestResourceInfo(name);
                if (manifestResourceInfo != null)
                {
                    Console.WriteLine(manifestResourceInfo.FileName);
                    Console.WriteLine(manifestResourceInfo.ResourceLocation);
                    Console.WriteLine(manifestResourceInfo.ReferencedAssembly);
                }
            }
            Console.WriteLine("************程序集引用的所有程序集******************");
            //此程序集引用的所有程序集
            AssemblyName[] assemblyNames = assembly.GetReferencedAssemblies();
            foreach (AssemblyName assemblyName in assemblyNames)
            {
                Console.WriteLine(assemblyName.FullName);//程序集全名
            }
            Console.WriteLine("************程序集Type******************");
            //此程序集中定义的类型
            Type[] types = assembly.GetTypes();
            foreach (Type type in types)
            {
                Console.WriteLine(type.FullName);
            }
            Console.WriteLine("************加载非当前程序集******************");
            assembly = Assembly.Load("ConsoleApplication2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");//程序集名称的长格式
            Console.WriteLine(assembly.FullName);
            assembly = Assembly.LoadFrom(@"E:\TestSLN\ClassLibrary1\bin\Debug\ClassLibrary1.dll");//填写完整的路径,会加载依赖项
            Console.WriteLine(assembly.FullName);
            //不知道如何指定文件,,下面指定的路径会报错
            //assembly = Assembly.LoadFile(@"E:\TestSLN\ConsoleApplication2\ConsoleApplication2.csproj");//这个方法不会加载此程序集引用的其他程序集,也就是不加载依赖项
            //Console.WriteLine(assembly.FullName);
            Console.ReadLine();
        }
    }
}

打印结果是


  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值