0

Использование номера версии веб-приложения из сборки (ASP.NET/C#)

7

Как мне получить номер версии вызываемого веб-приложения из ссылки на сборку?

Я пытался использовать System.Reflection.Assembly.GetCallingAssembly().GetName(), но он просто возвращает динамически скомпилированную сборку (номер версии 0.0.0.0).

ИЗМЕНЕНИЕ: В моем случае мне нужно решение, которое не требует обратной ссылки на класс внутри сборки веб-приложения. Ответ Джейсона ниже (отмечен как принятый) удовлетворяет этому требованию - многие другие предложенные здесь решения этого не делают.

5 ответ(ов)

0

Наиболее простой способ получить версию вашего "основного" сборки (вместо динамической) в виде однострочника выглядит так:

typeof(MyMainClass).Assembly.GetName().Version

Используйте свой главный класс, который вряд ли когда-либо "изменит свое значение" или будет заменен в результате рефакторинга, в качестве MyMainClass. Вы точно знаете, в какой сборке определён этот класс, и таким образом исключается всякая путаница относительно того, откуда берется номер версии.

0

Чтобы дополнить уже данные ответы, чтобы получить версию сборки в веб-приложении ASP.Net, вам нужно добавить метод в файл кода за, аналогичный следующему:

protected string GetApplicationVersion() {
    return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
}

На странице ASPX, где вы хотите отобразить номер версии, просто разместите:

<%= GetApplicationVersion() %>

Таким образом, версия приложения будет корректно отображаться на вашей веб-странице.

0

Возможно, кому-то это все еще интересно; данный подход должен сработать и будет немного безопаснее, чем просто использование 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;
  }
}

Надеюсь, это поможет!

0

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

0

Я столкнулся с аналогичной проблемой и думал, что данное решение может быть для вас полезным.

Мне нужно было получить текущую версию приложения (веб-приложения) из пользовательского серверного контроля, который находился в другой библиотеке. Проблема заключалась в том, что "самые простые" методы получения сборки не возвращали необходимую.

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

Теперь это решение работает, потому что у меня есть ссылка на тип из сборки приложения. Мы не используем страницы, которые не наследуются от кода за страницей, поэтому для нас оно оказывается эффективным, но у вас могут возникнуть трудности, если практики программирования вашей организации отличаются.

Удачного кодирования!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь