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

问题描述 投票:0回答:4

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

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

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

c# asp.net
4个回答
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() 语句。


1
投票

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


1
投票

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

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

这是一篇关于 使用 AppDomain 加载和卸载动态程序集的博客文章。

编辑:更好: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>
© www.soinside.com 2019 - 2024. All rights reserved.