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