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

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


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

30
задан Community 23 May 2017 в 11:48
поделиться

2 ответа

Это потому, что Assembly.GetEntryAssembly () возвращает значение null: там нет «входной» сборки на сайте 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 )

59
ответ дан 27 November 2019 в 23:14
поделиться

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

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() %>
15
ответ дан 27 November 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: