如何遍历所有程序集中的成员、类

引用网址:https://blog.csdn.net/qiandeqiande/article/details/79150589

System.Reflection.Assembly类是一个比较常用到的类,在反射中就经常用到。


//第一种:此方法发射加载DLL文件获取Mapping类
//string assembleFileName = Assembly.GetExecutingAssembly().CodeBase.Replace("Colligate.DataSource.ServiceMonitor.DLL", "Colligate.AddIn.Application.Mapping.dll").Replace("file:///", "");
//Assembly asm = Assembly.LoadFile(assembleFileName);

//第二种:此方法通过程序集获取到Mapping类
Assembly asm = Assembly.Load("Colligate.DataSource.ServiceMonitor");


var typesToRegister = asm.GetTypes()
.Where(type => !String.IsNullOrEmpty(type.Namespace))
.Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
foreach (var type in typesToRegister)
{
dynamic configurationInstance = Activator.CreateInstance(type);
modelBuilder.Configurations.Add(configurationInstance);
}

 

注意在Assembly里面的加载程序集有3个方法,分别是Load、LoadFrom和LoadFile。这3个方法有什么异同呢?

如果你引用了命名空间,那么就直接Load()方法,参数里面写上命名空间+类名就可以加载了。
如果仅仅知道一个dll文件的那么就要用LoadFrom()方法了,参数里面直接填写完整的路径。
  LoadFrom 方法具有以下缺点。请考虑改用 Load。

如果已加载一个具有相同标识的程序集,则即使指定了不同的路径,LoadFrom 仍返回已加载的程序集。
如果用 LoadFrom 加载一个程序集,随后加载上下文中的一个程序集尝试加载具有相同显示名称的程序集,则加载尝试将失败。对程序集进行反序列化时,可能发生这种情况。
  总结: LoadFrom只能用于加载不同标识的程序集, 也就是唯一的程序集, 不能用于加载标识相同但路径不同的程序集。

  3.LoadFile 加载指定路径上的程序集文件的内容。

  这个方法是从指定的文件来加载程序集,它是调用外部的API实现的加载方式,和上面Load,LoadFrom方法的不同之处是这个方法不会加载此程序集引用的其他程序集,也就是不会加载程序的依赖项。而同时也是不能加载相同标识的程序集的。

  4.GetExecutingAssembly获取当前正在执行的程序集。

 


static void Main(string[] args)
{
//需引用命名空间
Assembly assm = Assembly.Load("fanshe");
Console.WriteLine(assm.FullName); //输出 fanshe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

//依靠路径
Assembly assm1 = Assembly.LoadFrom(@"D:\fanshe.dll");
Console.WriteLine(assm1.FullName); 输出 fanshe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

//与Assembly.LoadFrom基本一样,只是如果被加载的dll,还依赖其他的dll的话,被依赖的对象不会加载
Assembly assm2 = Assembly.LoadFile(@"D:\fanshe.dll");
Console.WriteLine(assm2.FullName);

//当前正在执行的程序集
Assembly assm3 = Assembly.GetExecutingAssembly();
Console.WriteLine(assm3.FullName);

Console.ReadKey();
}

 


二、读取程序集中嵌入的资源
  读取嵌入的资源,主要有如下两个方法:

GetManifestResourceNames:读取嵌入的资源名称。
GetManifestResourceStream:读取嵌入的资源为流。
static void Main(string[] args)
{
Assembly ass = Assembly.LoadFrom(@"D:\test.dll");
string[] names = ass.GetManifestResourceNames();
foreach (string name in names)
{
Console.WriteLine("所有的嵌入资源名:" + name);
}

Stream myStream = ass.GetManifestResourceStream("Test.1.txt");
Console.WriteLine();
using (StreamReader sr = new StreamReader(myStream, Encoding.Default))
{
//嵌入的资源1.txt的内容
Console.WriteLine("嵌入的资源1.txt的内容:" + sr.ReadToEnd());
}

Console.ReadKey();
}

————————————————
版权声明:本文为CSDN博主「qiandeqiande」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qiandeqiande/article/details/79150589

posted @ 2022-01-05 11:57  MaxBruce  阅读(89)  评论(0编辑  收藏  举报