首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用程序集中的Web应用程序版本号(ASP.NET/C#)

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

Stack Overflow用户
提问于 2009-04-16 13:06:35
回答 12查看 69.7K关注 0票数 56

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

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

更新:在我的案例中,我需要一个不需要引用回web应用程序程序集中的类的解决方案。下面Jason的回答(标记为已接受)满足了这一要求--这里提交的许多其他人都没有。

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2011-01-26 18:21:54

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

它首先尝试对非web应用程序使用GetEntryAssembly()。这将在ASP.NET下返回null,然后查看HttpContext.Current以确定这是否是web应用程序。然后它使用当前HttpHandler的类型-但是如果调用是从ASPX页面发出的,那么这个类型的程序集可能是一个生成的ASP.NET程序集,所以它遍历HttpHandler的BaseType链,直到它找到一个不在ASP.NET用于其生成的类型("ASP")的命名空间中的类型。这通常是主程序集中的一个类型(例如,代码隐藏文件中的页面)。然后,我们可以使用该类型的程序集。如果所有其他方法都失败了,那么回退到GetExecutingAssembly()。

这种方法仍然存在潜在的问题,但它在我们的应用程序中是有效的。

代码语言:javascript
复制
    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的小项目中。

票数 52
EN

Stack Overflow用户

发布于 2010-11-02 14:55:07

我发现获得“主”程序集版本(而不是动态程序集)的最简单的一行方法是:

代码语言:javascript
复制
typeof(MyMainClass).Assembly.GetName().Version

使用您的顶级类作为MyMainClass,它不太可能“改变其含义”,也不会作为重构工作的一部分被替换。您知道这个类是在哪个程序集中定义的,不再会对版本号从哪里来感到困惑。

票数 43
EN

Stack Overflow用户

发布于 2009-04-16 13:10:05

我更喜欢用Web.Config来存储站点的当前版本。

您还可以尝试在web应用程序根目录中创建具有以下内容的AssemblyInfo.cs文件:

代码语言:javascript
复制
using System.Reflection;
using System.Runtime.CompilerServices;
...
[assembly: AssemblyVersion("1.0.*")]
...

然后通过如下代码访问该值:

代码语言:javascript
复制
System.Reflection.Assembly.GetExecutingAssembly()

下面是关于AssemblyInfo类的更多informaiton

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/756031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档