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