Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot get assembly version for footer

I'm using the automatic build versioning mentioned in this question (not the selected answer but the answer that uses the [assembly: AssemblyVersion("1.0.*")] technique). I'm doing this in the footer of my Site.Master file in MVC 2. My code for doing this is as follows:

<div id="footer">
    <a href="emailto:[email protected]">[email protected]</a> - Copyright © 2005-<%= DateTime.Today.Year.ToString() %>, foo LLC. All Rights Reserved.
    - Version: <%= Assembly.GetEntryAssembly().GetName().Version.ToString() %>
</div>

The exception I get is a Object reference not set to an instance of an object because GetEntryAssembly() returns NULL. My other options don't work either. GetCallingAssembly() always returns "4.0.0.0" and GetExecutingAssembly() always returns "0.0.0.0". When I go look at my DLLs, everything is versioning as I would expect. But I cannot figure out how to access it to display in my footer!!

like image 980
Jaxidian Avatar asked May 12 '10 00:05

Jaxidian


3 Answers

That's because Assembly.GetEntryAssembly() is returning null: there is no "entry" assembly in an ASP.NET site (because the .NET framework is hosted in the w3wp.exe process). Assembly.GetEntryAssembly() is used to get the .exe assembly that you launched from (usually in a console or Windows application)

The reason Assembly.GetAssembly(this.GetType()) is returning an assembly with version "0.0.0.0" is because ASP.NET compiles your Site.Master file into a temporary assembly under your "ASP.NET Temporary Files" folder. this is a reference to the "generated" class.

Assembly.GetExecutingAssembly() is basically the same as Assembly.GetAssembly(this.GetType()) (except it also works when there is no "this" (e.g. in static methods).

The best way would be use explicity use a type that you know exists in the assembly you're after. As an example, I assume your "Site.Master" has a code-behind file that is compiled into the assembly. You can use that instead:

Assembly.GetAssembly(typeof(Site)).GetName().Version.ToString()

(assuming the name of the class is Site)

like image 60
Dean Harding Avatar answered Nov 12 '22 10:11

Dean Harding


Just as another solution that people may be interested in, I've concocted these helpers to help with this problem:

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";
        }
    }
}

This allows consumption as follows in your footer:

Version: <%= Html.CurrentVersion() %> from <%= Html.CurrentVersionDate() %>
like image 23
Jaxidian Avatar answered Nov 12 '22 11:11

Jaxidian


You can:

e.g in your Application_Start method in Global.asax file add

protected void Application_Start(object sender, EventArgs e)
{
    HttpContext.Current.Application.Add("Version", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
}

in HTML show it by

<div><% =HttpContext.Current.Application["Version"].ToString() %></div>

ALSO Change Assembly version to 1.0.0.* by going to - Project properties > Application > Assembly Information and assembly version is shown as 1.0.0.0 - change it to 1.0.0.*

this will give you some versioning

like image 8
Moji Avatar answered Nov 12 '22 11:11

Moji