Jax*_*ian 30 versioning asp.net-mvc visual-studio-2010 asp.net-mvc-2
我正在使用此问题中提到的自动构建版本控制(不是选定的答案,而是使用该[assembly: AssemblyVersion("1.0.*")]技术的答案).我在MVC 2中的Site.Master文件的页脚中执行此操作.我执行此操作的代码如下:
<div id="footer">
<a href="emailto:webmaster@foo.com">webmaster@foo.com</a> - Copyright © 2005-<%= DateTime.Today.Year.ToString() %>, foo LLC. All Rights Reserved.
- Version: <%= Assembly.GetEntryAssembly().GetName().Version.ToString() %>
</div>
Run Code Online (Sandbox Code Playgroud)
我得到的例外是Object reference not set to an instance of an object因为GetEntryAssembly()返回NULL.我的其他选择也不起作用.GetCallingAssembly()始终返回"4.0.0.0"并GetExecutingAssembly()始终返回"0.0.0.0".当我查看我的DLL时,一切都是我期望的版本控制.但我无法弄清楚如何访问它以显示在我的页脚!
Dea*_*ing 59
那是因为Assembly.GetEntryAssembly()返回null:ASP.NET站点中没有 "入口"程序集(因为.NET框架托管在w3wp.exe进程中).Assembly.GetEntryAssembly()用于获取您启动的.exe程序集(通常在控制台或Windows应用程序中)
原因Assembly.GetAssembly(this.GetType())是返回版本为"0.0.0.0"的程序集是因为ASP.NET将您的Site.Master文件编译为"ASP.NET临时文件"文件夹下的临时程序集.this是对"生成"类的引用.
Assembly.GetExecutingAssembly()是基本上一样的Assembly.GetAssembly(this.GetType())(除了它也可以在没有"本"(例如,在静态方法).
最好的方法是使用明确使用您知道的程序集中存在的类型.例如,我假设您的"Site.Master"有一个代码隐藏文件,该文件被编译到程序集中.您可以使用它:
Assembly.GetAssembly(typeof(Site)).GetName().Version.ToString()
Run Code Online (Sandbox Code Playgroud)
(假设班级名称是Site)
Jax*_*ian 15
正如人们可能感兴趣的另一种解决方案一样,我已经编造了这些助手以帮助解决这个问题:
public static class HtmlHelperExtensions
{
private static string _CachedCurrentVersionDate;
/// <summary>
/// Return the Current Version from the AssemblyInfo.cs file.
/// </summary>
public static string CurrentVersion(this HtmlHelper helper)
{
try
{
var version = Assembly.GetExecutingAssembly().GetName().Version;
return version.ToString();
}
catch
{
return "?.?.?.?";
}
}
public static string CurrentVersionDate(this HtmlHelper helper)
{
try
{
if (_CachedCurrentVersionDate == null)
{
// Ignores concurrency issues - assuming not locking this is faster than
// locking it, and we don't care if it's set twice to the same value.
var version = Assembly.GetExecutingAssembly().GetName().Version;
var ticksForDays = TimeSpan.TicksPerDay * version.Build; // days since 1 January 2000
var ticksForSeconds = TimeSpan.TicksPerSecond * 2 * version.Revision; // seconds since midnight, (multiply by 2 to get original)
_CachedCurrentVersionDate = new DateTime(2000, 1, 1).Add(new TimeSpan(ticksForDays + ticksForSeconds)).ToString();
}
return _CachedCurrentVersionDate;
}
catch
{
return "Unknown Version Date";
}
}
}
Run Code Online (Sandbox Code Playgroud)
这允许您的页脚中的消费如下:
Version: <%= Html.CurrentVersion() %> from <%= Html.CurrentVersionDate() %>
Run Code Online (Sandbox Code Playgroud)
您可以:
例如在Global.asax文件中的Application_Start方法中添加
protected void Application_Start(object sender, EventArgs e)
{
HttpContext.Current.Application.Add("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
}
Run Code Online (Sandbox Code Playgroud)
在HTML中显示它
<div><% =HttpContext.Current.Application["Version"].ToString() %></div>
Run Code Online (Sandbox Code Playgroud)
另外,通过转到 - 项目属性>应用程序>程序集信息将程序集版本更改为1.0.0.*,程序集版本显示为1.0.0.0 - 将其更改为1.0.0.*
这会给你一些版本
| 归档时间: |
|
| 查看次数: |
17407 次 |
| 最近记录: |