Подтвердить что ты не робот

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

Можно ли получить имя сборки веб-приложения ASP.NET из ссылочной сборки?

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


Длительное объяснение:

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

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

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

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

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

4b9b3361

Ответ 1

Попробуйте

BuildManager.GetGlobalAsaxType().BaseType.Assembly

Ответ 2

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

HttpContext.Current.ApplicationInstance.GetType().Assembly

Ответ 3

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