2009-07-07 40 views
4

一個簡單的問題。我有一個包含幾個程序集的ASP.NET Web應用程序,我需要爲網站中的每個程序集創建一個版本信息列表。 (也許甚至還有其他幾個人,但重點主要針對網站本身。)它的網站使用的程序集版本號列表

此列表將顯示在受保護頁面上的同一應用程序中,用於驗證網站的安裝和升級。當然,我可以遍歷BIN文件夾中的所有二進制文件,並從中提取信息,但是有更好的選擇嗎?

第二個問題:從另一個程序集中提取版本信息的最佳方法是什麼?但是我想,以前有人問過,我可以自己找到答案。每一個(有什麼與反思,GetExecutingAssembly和一些更多的東西。)

回答

6
IEnumerable<String> GetLoadedAssemblies() { 
    foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { 
     yield return assembly.ToString(); 
    } 
} 

帶給你的名字(包括版本號)組件,其在應用領域中使用。

mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

一個可能的疑難雜症與使用這樣的:如果該網站剛剛開始,然後一些你感興趣的可能沒有被加載到AppDomain中的組件呢,因爲他們」不太可能被只有這個功能的特殊頁面引用。如果你先點擊該網站以確保所有內容都已加載,那麼它應該可以正常工作,但如果你需要更強大的功能,則必須在上面的代碼中添加一些AppDomain.Load()語句。

+0

偉大的作品,發現比的東西,我可以拿出更多。 :-) 謝謝! – 2009-07-07 12:43:09

1

關於你的第二部分,我認爲你在從程序集中獲取信息時會遇到困難而不加載它。如果您不打算實際使用該程序集,則可能不是您想隨身攜帶的程序,因爲您無法從AppDomain卸載程序集。

看看如何創建一個新的AppDomain並加載程序集以獲取所需的信息。然後,您可以扔掉新的appdomain,並在完成後丟失所有程序集引用。

這是Using AppDomain to Load and Unload Dynamic Assemblies的博客文章。

編輯:更妙的是:Thread on StackOverFlow

1

我颳起了這個頁面:

<%@ Page Language="C#" %> 
<%@ Import Namespace="System.Collections.Generic" %> 
<%@ Import Namespace="System.Reflection" %> 
<script runat="server"> 
void Page_Load(Object sender, EventArgs e) 
{ 
    List<string> assemblyNames = GetLoadedAssemblyNames(false); 
    StringBuilder sb = new StringBuilder(); 
    foreach (string ass in assemblyNames) 
    { 
     sb.AppendFormat("{0}\n", ass); 
    } 

    this.Results.Text = sb.ToString(); 
} 

private static List<string> GetLoadedAssemblyNames(bool hideSystem) 
{ 
    List<string> names = new List<string>(); 

    foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) 
    { 
     string name = a.GetName().FullName; 
     if (hideSystem && (name.StartsWith("System.") || name.StartsWith("Microsoft."))) 
     { 
      continue; 
     } 

     names.Add(name); 
    } 

    names.Sort(); 
    return names; 
} 
</script> 
<html> 
<body> 
<form id="form1" runat="server"> 
<h1>Loaded Assemblies</h1> 
<p><asp:Literal runat="server" ID="AppName" /></p> 
<pre><asp:Literal runat="server" ID="Results" /></pre> 
</form> 
</body> 
</html> 
相關問題