2009-07-07 26 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> 
相关问题