Получить имя сборки веб-приложения независимо от текущей исполняемой сборки
Возможно ли получить имя сборки веб-приложения ASP.NET из ссылочной сборки?
Assembly.GetEntryAssembly отлично работала в настольных и консольных приложениях, но, похоже, в веб-приложениях она всегда равна нулю, а GetExecuting\GetCallingAssebly возвращает мою сборку, на которую ссылаются, а не ту из веб-приложения.
Длинное объяснение:
Я написал собственный поставщик настроек, который вместо чтения конфигурации из файла конфигурации приложения получает настройки из централизованной службы конфигурации.
Пользовательский поставщик находится в отдельной сборке, поэтому он может использоваться различными приложениями.
Свойство ApplicationName необходимо переопределить именем сборки приложения.
Использование провайдера возможно только через собственный атрибут.net, поэтому я не могу отправлять ему какие-либо параметры.
Поскольку ни один из методов Assembly.Get*Assembly, кажется, не работает, единственное, о чем я могу подумать, это требование установки приложения с именем приложения для веб-приложений, но я не очень доволен этим. Любая помощь с этим приветствуется, спасибо!
3 ответа
Ты можешь использовать
HttpContext.Current.ApplicationInstance.GetType().Assembly
Я знаю, что это старый вопрос, но это был мой подход к несколько похожей ситуации. В моем случае a использовал другую сборку для форматирования строки с версией, которую нужно показать для нескольких программ с одинаковым ядром.
Version v = null;
var a = Assembly.GetEntryAssembly() ?? GetWebEntryAssembly() ?? Assembly.GetExecutingAssembly();
SnapshotVersion = FileVersionInfo.GetVersionInfo(a.Location).ProductVersion;
if (ApplicationDeployment.IsNetworkDeployed)
{
var d = ApplicationDeployment.CurrentDeployment;
v = d.CurrentVersion;
v = new Version(v.Major, v.Minor, v.Revision);
}
else
v = a.GetName().Version;
if (v != null)
version = string.Format("{0}.{1}.{2}", v.Major, v.Minor, v.Build);
Поскольку это находится в статическом конструкторе, все, что мне нужно было сделать, это вызвать любое свойство этого статического класса из веб-приложения и затем найти последнюю вызывающую сборку, которая отличается от сборки, в которой находится статический класс. Это было достигнуто с помощью метода GetWebEntryAssembly.
private static Assembly GetWebEntryAssembly()
{
var frames = new StackTrace().GetFrames();
var i = frames.FirstOrDefault(c => Assembly.GetAssembly(c.GetMethod().DeclaringType).FullName != Assembly.GetExecutingAssembly().FullName).GetMethod().DeclaringType;
return Assembly.GetAssembly(i);
}