其网站使用的程序集版本号列表

Posted

技术标签:

【中文标题】其网站使用的程序集版本号列表【英文标题】:List of version numbers of assemblies used by it's web site 【发布时间】:2009-07-07 12:26:51 【问题描述】:

一个简单的问题。我有一个包含多个程序集的 ASP.NET Web 应用程序,我需要为网站中的每个程序集创建一个版本信息列表。 (甚至可能还有其他一些人,但重点主要是网站本身。)

此列表将显示在受保护页面上的同一应用程序中,用于验证网站的安装和升级。当然,我可以遍历 BIN 文件夹中的所有二进制文件并从中提取信息,但有更好的选择吗?

第二个问题:从另一个程序集中提取版本信息的最佳方法是什么?但我想以前有人问过,我自己可以找到答案。 (带有反射、GetExecutingAssembly 和其他一些东西。)

【问题讨论】:

【参考方案1】:
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() 语句。

【讨论】:

效果很好,而且比我能想出的东西还多。 :-) 谢谢!【参考方案2】:

您还可以使用 Assembly 类的 GetReferencedAssemblies() 方法来获取您的 Web 应用程序引用的所有程序集。

【讨论】:

【参考方案3】:

关于您的第二部分,我认为您在不加载程序集的情况下从程序集中获取信息会有困难。如果您不打算实际使用该程序集,那么您可能不想随身携带它,因为您无法从 AppDomain 中卸载程序集。

查看创建一个新的 AppDomain 并在其中加载程序集以获得所需的信息。然后,您可以丢弃新的 appdomain,并在完成后丢失所有程序集引用。

这是Using AppDomain to Load and Unload Dynamic Assemblies 上的一篇博文。

编辑:更好:Thread on ***

【讨论】:

【参考方案4】:

我打开了这个页面:

<%@ 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>

【讨论】:

以上是关于其网站使用的程序集版本号列表的主要内容,如果未能解决你的问题,请参考以下文章

程序集使用版本 X,其版本高于引用的程序集错误

C#如何在签入策略期间获取挂起更改的程序集

使用 maven 将版本号输出到文本文件

使用星号时是啥导致程序集版本增加?

c# 未能载入文件或程序集

C#如何在签入策略期间获取挂起更改的程序集