Использование номера версии веб-приложения из сборки (ASP.NET/C#)
Как мне получить номер версии вызываемого веб-приложения из ссылки на сборку?
Я пытался использовать System.Reflection.Assembly.GetCallingAssembly().GetName(), но он просто возвращает динамически скомпилированную сборку (номер версии 0.0.0.0).
ИЗМЕНЕНИЕ: В моем случае мне нужно решение, которое не требует обратной ссылки на класс внутри сборки веб-приложения. Ответ Джейсона ниже (отмечен как принятый) удовлетворяет этому требованию - многие другие предложенные здесь решения этого не делают.
5 ответ(ов)
Наиболее простой способ получить версию вашего "основного" сборки (вместо динамической) в виде однострочника выглядит так:
typeof(MyMainClass).Assembly.GetName().Version
Используйте свой главный класс, который вряд ли когда-либо "изменит свое значение" или будет заменен в результате рефакторинга, в качестве MyMainClass
. Вы точно знаете, в какой сборке определён этот класс, и таким образом исключается всякая путаница относительно того, откуда берется номер версии.
Чтобы дополнить уже данные ответы, чтобы получить версию сборки в веб-приложении ASP.Net, вам нужно добавить метод в файл кода за, аналогичный следующему:
protected string GetApplicationVersion() {
return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
На странице ASPX, где вы хотите отобразить номер версии, просто разместите:
<%= GetApplicationVersion() %>
Таким образом, версия приложения будет корректно отображаться на вашей веб-странице.
Возможно, кому-то это все еще интересно; данный подход должен сработать и будет немного безопаснее, чем просто использование BaseType
класса ApplicationInstance
, чтобы получить реализацию Global.asax.
Global.asax всегда компилируется в тот же сборник, что и атрибуты сборки из файла AssemblyInfo.cs, так что этот метод должен работать для всех веб-приложений, которые определяют свой Global.asax.
Для тех, кто не определяет собственный Global.asax, будет использоваться версия сгенерированного типа global_asax
, который всегда имеет версию 0.0.0.0, а для приложений, которые не являются веб-приложениями, просто вернется отсутствие версии.
Бонус: использование класса BuildManager
не требует активного экземпляра HttpContext
, что означает, что вы можете использовать это и в коде инициализации приложения.
Вот пример кода:
public static Version GetHttpApplicationVersion() {
Type lBase = typeof(HttpApplication);
Type lType = BuildManager.GetGlobalAsaxType();
if (lBase.IsAssignableFrom(lType))
{
while (lType.BaseType != lBase) { lType = lType.BaseType; }
return lType.Assembly.GetName().Version;
}
else
{
return null;
}
}
Надеюсь, это поможет!
Чтобы получить версию сборки из HttpContext.Current.ApplicationInstance
, которая наследуется от класса в global.asax.cs
, вы можете использовать следующий код:
var instance = HttpContext.Current.ApplicationInstance;
Assembly asm = instance.GetType().BaseType.Assembly;
System.Version asmVersion = asm.GetName().Version;
Этот подход будет работать как в ASP.NET (ASPX), так и в ASP.NET MVC.
В этом коде мы получаем экземпляр приложения через ApplicationInstance
, затем берем его базовый тип (класс, от которого он наследуется), и из него извлекаем сборку. Наконец, мы получаем версию этой сборки. Это может быть полезно для проверки версии приложения или других целей, связанных с управлением сборками.
Я столкнулся с аналогичной проблемой и думал, что данное решение может быть для вас полезным.
Мне нужно было получить текущую версию приложения (веб-приложения) из пользовательского серверного контроля, который находился в другой библиотеке. Проблема заключалась в том, что "самые простые" методы получения сборки не возвращали необходимую.
Assembly.GetExecutingAssembly()
возвращал сборку, содержащую контрол, а не сборку приложения.Assembly.GetCallingAssembly()
возвращал разные сборки в зависимости от того, где я находился в дереве вызовов; обычно это была System.Web, а иногда сборка, содержащая контрол.Assembly.GetEntryAssembly()
возвращалnull
.new StackTrace().GetFrames()[idx].GetMethod().DeclaringType.Assembly
позволяет получить сборку фрейма в трассировке стека по индексуidx
; однако, помимо того, что это неэстетично, дорого и подвержено ошибкам при неправильном индексе фрейма, возможно, что трассировка стека не содержит вызовов к сборке приложения.Assembly.GetAssembly(Page.GetType())
возвращал сборкуApp_Web_@#$@#$%@
, содержащую динамически сгенерированную страницу. Разумеется, динамическая страница наследует класс из сборки приложения, что и привело к окончательному решению:
Assembly.GetAssembly(Page.GetType().BaseType)
С полученной ссылкой на сборку вы можете легко извлечь версию через её имя:
var version = Assembly.GetAssembly(Page.GetType().BaseType)
.GetName()
.Version;
Теперь это решение работает, потому что у меня есть ссылка на тип из сборки приложения. Мы не используем страницы, которые не наследуются от кода за страницей, поэтому для нас оно оказывается эффективным, но у вас могут возникнуть трудности, если практики программирования вашей организации отличаются.
Удачного кодирования!
В C# в чем разница между public, private, protected и отсутствием модификатора доступа?
Не удается обновить EntitySet: определен DefiningQuery, но отсутствует элемент <UpdateFunction>
Лучшая настройка непрерывной интеграции для одиночного разработчика (.NET) [закрыт]
Как запустить модульные тесты на платформе x64?
"Ошибка при выполнении криптографической операции при расшифровке cookie Forms"