Подтвердить что ты не робот

Не удается получить версию сборки для нижнего колонтитула

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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 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() %>

Ответ 3

Вы можете:

например, в вашем методе 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. *, перейдя в - Свойства проектa > Приложение > Информация о сборке и сборке показана как 1.0.0.0 - измените ее на 1.0.0. *

это даст вам некоторое управление версиями

Ответ 4

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

Global.asax.cs:

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

Ваше мнение:

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