2011-09-18 2 views
12

Возможно ли получить имя сборки веб-приложения ASP.NET, с указанной сборки?Получить имя сборки веб-приложения, независимо от текущей сборки сборки

Assembly.GetEntryAssembly отлично работает в настольных и консольных приложениях, но, похоже, в веб-приложениях всегда пусто, а GetExecuting \ GetCallingAssebly возвращает мою ссылочную сборку, а не та, что есть в веб-приложении.


Long Объяснение:

Я написал обычай Settings Provider, что вместо чтения конфигурации из файла конфигурации приложения, он получает настройки от централизованной службы конфигурации.

Пользовательский поставщик находится в отдельной сборке, поэтому он может использоваться различными приложениями.

Свойство ApplicationName должно быть переоценено с именем сборки приложения.

Способ использования провайдера - это .net custom attribute, поэтому я не могу отправить никаких параметров.

С момента сборки Assembly.Get * Кажется, что методы сборки работают, единственное, о чем я могу думать, - это приложение appSetting с именем приложения для веб-приложений, но я не очень этому доволен. Любая помощь с этим оценивается, спасибо!

ответ

16

Попробуйте

BuildManager.GetGlobalAsaxType().BaseType.Assembly 
+3

Я получаю «Этот метод не может быть вызван во время этапа инициализации перед запуском приложения». при попытке использовать этот метод в ASP.NET MVC. – Tomas

+0

Это возвращает «mscorlib» для меня. – Slavo

+1

Это не работает, если вы не включаете файл Global.asax в свой проект. – Slavo

8

Вы можете использовать

HttpContext.Current.ApplicationInstance.GetType().Assembly 
+1

это не работает:/... ApplicationInstance равно нулю в Application_Start() метод (когда поставщик параметров инициализации), так и внутри контроллеров возвращает странные выполнения сгенерированного сборки (например, App_global.asax.hiqe17zm, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null) – Pablote

+2

@Pabote: попытайтесь получить сборку своего 'BaseType' (который должен быть определен в коде пользователя) – SLaks

+2

Это не работает, если вы не включаете Global .asax в вашем проекте. – Slavo

0

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