ASP.NET MVC: как получить сборку информации из экземпляра HtmlHelper?

У меня есть метод расширения HtmlHelper в сборке, отдельно от моего приложения MVC. В рамках метода расширения я хотел бы получить номер версии сборки приложения MVC. Возможно ли это?

Вызывающая сборка представляет собой динамическую сборку вида бритвы, которая не помогает. Есть ли какой-нибудь объект, вложенный в HtmlHelper, который может предоставить мне номер версии сборки приложения MVC? Я изучал документацию класса HtmlHelper, но до сих пор не нашел решения моей проблемы.

Спасибо!

Ответ 1

Это печально злая вещь, потому что, к сожалению, нет особого надежного способа сделать это.

Так как это приложение MVC, тем не менее, есть вероятность, что у него есть Global.asax.cs - поэтому он имеет локально определенный класс HttpApplication.

Внутри html-помощника вы можете получить следующее:

public static string AppVersion(this HtmlHelper html)
{
  var appInstance = html.ViewContext.HttpContext.ApplicationInstance;
  //given that you should then be able to do 
  var assemblyVersion = appInstance.GetType().BaseType.Assembly.GetName().Version;
  //note the use of the BaseType - see note below
  return assemblyVersion.ToString();
}

Примечание

Вы можете задаться вопросом, почему код использует BaseType экземпляра приложения, а не просто тип. Это потому, что файл Global.asax.cs является основным типом приложения MVC, но затем Asp.Net динамически компилирует другой тип HttpApplication, который наследуется от него через Global.asax.

Как я сказал ранее; это работает на большинстве сайтов MVC, потому что все они должны иметь класс приложения, определенный в файле Global.asax.cs по соглашению (потому что это способ, которым настроен проект).

Ответ 2

На всякий случай, когда кто-то сталкивается с этим, вот что сработало для меня (MVC5 VS2013). Войдите прямо в представление:

@ViewContext.HttpContext.ApplicationInstance.GetType().BaseType.Assembly.GetName().Version.ToString();

Ответ 3

Просто выполните поиск сборки, которая должна быть источником для вашего номера версии

AppDomain.CurrentDomain.GetAssemblies().Where(a => a.GetName().Name.Equals("MyDll")).First().GetName().Version.ToString();