Не удается получить версию сборки для нижнего колонтитула
Я использую автоматическое построение версий, упомянутое в этом вопросе (а не выбранный ответ, но ответ, который использует технику [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 файлы, все происходит с версией, как и следовало ожидать. Но я не могу понять, как получить доступ к нему для отображения в моем нижнем колонтитуле!
Ответы
Ответ 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>