1. 程式人生 > 其它 >如何遍歷所有程式集中的成員、類

如何遍歷所有程式集中的成員、類

引用網址: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