标签:模块 dll 托管模块 and 特性 激活 system 格式 数据
程序集详情,可以查看https://docs.microsoft.com/zh-cn/dotnet/standard/assembly/
程序集构成了 .NET 应用程序的部署、版本控制、重用、激活范围和安全权限的基本单元。采用可执行文件 (.exe) 或动态链接库文件 (.dll) 的形式,是 .NET 应用程序的构建基块 。是一个或多个类型定义文件及资源文件的集合。
程序集定义以下信息:
静态程序集可能由以下四个元素组成:其中只有程序集清单是必需的,但也需要类型或资源来向程序集提供任何有意义的功能。
其中C#源代码经过C#编译器,生成托管模块,最后编译器默认把生成的托管模块和资源文件合并成程序集。如果只有一个托管模块,且没有资源(或数据)文件的项目,程序集就是托管模块,生成过程中无需执行任何额外的步骤。
程序集是PE32文件或者64位Windows可移植执行体(PE32+:Portable Executable)文件,包括
代码执行过程:
获取程序集:
获取不到抛出异常,而不是返回null值
//Assebmly静态方法获取程序集
Assembly assembly = Assembly.Load("StudyConsole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
assembly = Assembly.Load("StudyConsole");
assembly = Assembly.Load(new AssemblyName("StudyConsole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") { });
Assembly assembly1 = Assembly.LoadFile(@"D:\1-办公\dnSpy\dnSpy\dnSpy.Console\obj\Debug\netcoreapp3.1\dnSpy.Console.dll");
Assembly assembly2 = Assembly.LoadFrom(@"D:\1-办公\dnSpy\dnSpy\dnSpy\bin\Debug\netcoreapp3.1\dnlib.dll");
//仅查看程序集,不能执行
Assembly assembly3 = Assembly.ReflectionOnlyLoad("");
Assembly assembly4 = Assembly.ReflectionOnlyLoadFrom("");
//获取当前执行的程序集
Assembly assembly8 = Assembly.GetExecutingAssembly();
//获取当前应用程序域所有加载的程序集
Assembly[] assembly6 = AppDomain.CurrentDomain.GetAssemblies();
//根据类型获取
Assembly assembly5 = Assembly.GetAssembly(typeof(System.String));
Assembly assembly7 = typeof(Program).Assembly;
//获取程序集的特性
var asstributes= assembly.CustomAttributes;
//获取引用的AssebmlyName
AssemblyName[] ass= assembly.GetReferencedAssemblies();
获取程序集的方法中,Load(string)方法,会先把string转换成Assebmly,在调用。和Load(AssebmlyName)的内部方法方式一致;LoadFrom方法和Load方法最终调用的方法一致,传入的地址最终转换成Assebmly类型。
(程序集名称的长格式包含其简单名称(如 System .dll 程序集的 "System")及其版本、区域性、公钥标记,还可以是其处理器体系结构。 它对应于程序集的 FullName 属性。)
Load方法会优先使用当前应用程序域中的程序集(猜测),因为当用LoadFile加载程序集之后,在加载同样的程序集不会报错。
Load方法初始化的是Assebmly的Name属性,LoadFrom是CodeBase;
其中LoadFile和Load方法实现方式不一致,CSDN(LoadFile 不会加载相应的引用程序集,但是 LoadFrom 会。 LoadFrom 不能用于加载具有相同标识但路径不同的程序集;它将只加载第一个此类程序集。)
ReflectionOnlyLoad、ReflectionOnlyLoadFrom最终的方法和Load方法一致,只是传入了一个区分的bool值。但是使用.NET CORE执行会报错。
程序集的属性截图:
其中CodeBase和Location,都是文件地址;DefinedTypes是所有的类型,ExportedTypes是所有pulbli类。
标签:模块 dll 托管模块 and 特性 激活 system 格式 数据
原文地址:https://www.cnblogs.com/drahab/p/13334113.html