如何在引用的程序集中获取调用web应用程序的版本号?
我尝试过使用System.Reflection.Assembly.GetCallingAssembly().GetName(),但它只给出了动态编译的程序集(返回版本号0.0.0.0)。
更新:在我的案例中,我需要一个不需要引用回web应用程序程序集中的类的解决方案。下面Jason的回答(标记为已接受)满足了这一要求--这里提交的许多其他人都没有。
发布于 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()。
这种方法仍然存在潜在的问题,但它在我们的应用程序中是有效的。
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;
}
发布于 2010-11-02 14:55:07
我发现获得“主”程序集版本(而不是动态程序集)的最简单的一行方法是:
typeof(MyMainClass).Assembly.GetName().Version
使用您的顶级类作为MyMainClass
,它不太可能“改变其含义”,也不会作为重构工作的一部分被替换。您知道这个类是在哪个程序集中定义的,不再会对版本号从哪里来感到困惑。
发布于 2009-04-16 13:10:05
我更喜欢用Web.Config来存储站点的当前版本。
您还可以尝试在web应用程序根目录中创建具有以下内容的AssemblyInfo.cs文件:
using System.Reflection;
using System.Runtime.CompilerServices;
...
[assembly: AssemblyVersion("1.0.*")]
...
然后通过如下代码访问该值:
System.Reflection.Assembly.GetExecutingAssembly()
下面是关于AssemblyInfo类的更多informaiton 。
https://stackoverflow.com/questions/756031
复制相似问题