如何使用程序集中的Web应用程序版本号(ASP.NET / C#)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

如何获取引用程序集中的调用Web应用程序的版本号?

我试过使用System.Reflection.Assembly.GetCallingAssembly()。GetName(),但它只是给我动态编译的程序集(返回版本号0.0.0.0)。

提问于
用户回答回答于

下面是我使用的一些代码,它支持从Web或非Web应用程序获取应用程序的“主”程序集,然后可以使用GetName()。Version来获取版本。

它首先为非Web应用程序尝试GetEntryAssembly()。这在ASP.NET下返回null。然后它查看HttpContext.Current以确定这是否是Web应用程序。然后它使用当前HttpHandler的类型 - 但是如果该调用是使用ASPX页面创建的,则此类型的程序集可能是生成的ASP.NET程序集,因此它会遍历HttpHandler的BaseType链,直到找到不在其中的类型ASP.NET为其生成的类型(“ASP”)使用的名称空间。这通常是主程序集中的一个类型(例如,代码隐藏文件中的页面)。然后我们可以使用该类型的组件。如果一切都失败,则返回到GetExecutingAssembly()。

这种方法仍然存在潜在的问题,但它适用于我们的应用程序。

    private const string AspNetNamespace = "ASP";

    private static Assembly getApplicationAssembly()
    {
        // Try the EntryAssembly, this doesn't work for ASP.NET classic pipeline (untested on integrated)
        Assembly ass = Assembly.GetEntryAssembly();

        // Look for web application assembly
        HttpContext ctx = HttpContext.Current;
        if (ctx != null)
            ass = getWebApplicationAssembly(ctx);

        // Fallback to executing assembly
        return ass ?? (Assembly.GetExecutingAssembly());
    }

    private static Assembly getWebApplicationAssembly(HttpContext context)
    {
        Guard.AgainstNullArgument(context);

        object app = context.ApplicationInstance;
        if (app == null) return null;

        Type type = app.GetType();
        while (type != null && type != typeof(object) && type.Namespace == AspNetNamespace)
            type = type.BaseType;

        return type.Assembly;
    }

我已经将这些代码汇集GitHubNuGet上的一个小项目中。

用户回答回答于

我发现最简单的一种方法来获取“main”程序集(而不是动态程序集)的版本是:

typeof(MyMainClass).Assembly.GetName().Version

使用你的顶级类,它不可能“改变它的意义”,或者作为重构努力的一部分被替换,如MyMainClass。你知道在哪个程序集中定义了这个类,并且不再存在版本号从何而来的混淆。

扫码关注云+社区