无法获取页脚的汇编版本

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)

  • 这有效!`<%= Assembly.GetAssembly(typeof(HomeController)).GetName().Version.ToString()%>` (11认同)

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)


Moj*_*oji 8

您可以:

例如在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.*

这会给你一些版本