Не удается получить версию сборки для нижнего колонтитула - PullRequest
30 голосов
/ 12 мая 2010

Я использую автоматическое версионирование сборки, упомянутое в этом вопросе (не выбранный ответ, а ответ, использующий метод [assembly: AssemblyVersion("1.0.*")]) Я делаю это в нижнем колонтитуле моего файла Site.Master в MVC 2. Мой код для этого выглядит следующим образом:

<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>

Исключение, которое я получаю, это Object reference not set to an instance of an object, потому что GetEntryAssembly() возвращает NULL. Мои другие варианты тоже не работают. GetCallingAssembly() всегда возвращает «4.0.0.0», а GetExecutingAssembly() всегда возвращает «0.0.0.0». Когда я смотрю на мои DLL, все становится версионным, как я и ожидал. Но я не могу понять, как получить к нему доступ для отображения в моем нижнем колонтитуле !!

Ответы [ 4 ]

59 голосов
/ 12 мая 2010

Это потому, что Assembly.GetEntryAssembly() возвращает ноль: там нет сборки "entry" на сайте ASP.NET (потому что .NET Framework размещен в процессе 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()) (за исключением того, что оно также работает, когда нет «this» (например, в статических методах).

Лучшим способом было бы использовать явное использование типа, который, как вы знаете, существует в сборке, за которой вы работаете. В качестве примера я предполагаю, что ваш «Site.Master» имеет файл с выделенным кодом, который компилируется в сборку. Вы можете использовать это вместо:

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

(при условии, что имя класса Site)

15 голосов
/ 12 мая 2010

Так же, как другое решение, которое может заинтересовать людей, я придумала этих помощников, чтобы помочь с этой проблемой:

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

Это разрешает потребление в нижнем колонтитуле следующим образом:

Version: <%= Html.CurrentVersion() %> from <%= Html.CurrentVersionDate() %>
8 голосов
/ 15 ноября 2012

Вы можете:

например, в вашем методе Application_Start в файле Global.asax добавьте

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

в HTML показать это

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

ТАКЖЕ Измените версию сборки на 1.0.0. *, Перейдя в - Свойства проекта> Приложение> Сборка Информация и версия сборки отображаются как 1.0.0.0 - измените ее на 1.0.0. *

это даст вам некоторую версию

3 голосов
/ 12 февраля 2012

Если у вас уже есть Global.asax, это может быть хорошим местом для однократного хранения версии.

Global.asax.cs:

public class Global : HttpApplication
{
    public static readonly Version Version = Assembly.GetExecutingAssembly().GetName().Version;
}

Ваш взгляд:

<div>- Version: @YourNamespace.Global.Version</div>
...