簡體   English   中英

C#如何獲取非系統程序集

[英]C# how to get non-system assemblies

我需要實例化僅在程序程序集或mscorlib中定義的對象,而不在任何其他系統程序集中定義的對象。 目前,我正在這樣做:

Type type;
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly assembly in assemblies)
{
    string fullName = name + "," + assembly.FullName;
    type = Type.GetType(fullName);
    if (type != null) break;
}
if (type != null) 
    object obj = Activator.CreateInstance(type);

有沒有一種方法可以優化此循環以跳過系統程序集(但不包括mscorlib)? 我需要多次打電話。

謝謝!

您可以嘗試如下操作:

  loadedAssemblies = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
                   where
                     assembly.ManifestModule.Name != "<In Memory Module>"                         
                     && !assembly.FullName.StartsWith("System")
                     && !assembly.FullName.StartsWith("Microsoft")
                     && assembly.Location.IndexOf("App_Web") == -1
                     && assembly.Location.IndexOf("App_global") == -1
                     && assembly.FullName.IndexOf("CppCodeProvider") == -1
                     && assembly.FullName.IndexOf("WebMatrix") == -1
                     && assembly.FullName.IndexOf("SMDiagnostics") == -1
                     && !String.IsNullOrEmpty(assembly.Location)
                   select assembly).ToList();

一旦有了“ loadedAssemblies”,就可以執行此操作。

如果您多次調用此方法,則將加載的程序集存儲在變量中,這樣就不必每次都查詢,而只是遍歷列表。

您可以調用Load()。 從備注:

http://msdn.microsoft.com/en-us/library/36az8x58.aspx

如果已經加載了所請求程序集的版本,則即使請求了其他版本,此方法也會返回已加載的程序集。

但是,在幕后,我不確定這是否比您的O(n)循環快(甚至不同)。 您可能要同時測試它們。 如果您需要為多個程序集運行此循環,那么我建議運行一次循環,然后查找您需要的所有程序集。 如果您為同一個程序集多次運行此循環,那么我建議您使用單例類型模式,在該模式下您可以一次獲得引用,而不必再次查找。

如果您了解所有程序匯編,則可以對其進行匯總。 您也可以加載Mscorlib.dll,而不必遍歷每個程序集。 本質上,我提議將白名單而不是黑名單。

Assembly assembly = Assembly.Load("Mscorlib.dll");

http://ondotnet.com/pub/a/dotnet/excerpt/prog_csharp_ch18/index.html?page=5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM