Ответ 1
Попробуйте
BuildManager.GetGlobalAsaxType().BaseType.Assembly
Можно ли получить имя сборки веб-приложения ASP.NET из ссылочной сборки?
Assembly.GetEntryAssembly отлично работала в настольных и консольных приложениях, но в веб-приложениях она всегда имеет нулевое значение, а GetExecuting\GetCallingAssebly возвращает мою ссылку на сборку, а не та, которая находится в веб-приложении.
Длительное объяснение:
Я написал собственный Поставщик настроек, который вместо того, чтобы читать конфигурацию из файла конфигурации приложения, получает настройки из централизованной службы конфигурации.
Пользовательский поставщик находится в отдельной сборке, поэтому он может использоваться различными приложениями.
Свойство ApplicationName должно быть переопределено с именем сборки приложения.
Способ использования провайдера - это .NET custom attribute, поэтому я не могу отправлять ему никаких параметров.
Поскольку функции Assembly.Get * Assembly не работают, единственное, о чем я могу думать, - это приложение appSetting с именем приложения для веб-приложений, но я не очень этому доволен. Любая помощь с этим оценивается, спасибо!
Попробуйте
BuildManager.GetGlobalAsaxType().BaseType.Assembly
Вы можете использовать
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);
}