2011-09-18 18 views
12

¿Es posible obtener el nombre del ensamblado de una aplicación web ASP.NET, a partir de un ensamblaje al que se hace referencia?Obtener el nombre del ensamblado de la aplicación web, independientemente del ensamblaje de ejecución actual

Assembly.GetEntryAssembly funcionó bien en el escritorio y aplicaciones de consola, pero parece estar siempre nulo en aplicaciones web, y GetExecuting \ GetCallingAssebly me devuelve el ensamblaje de referencia, no el de la aplicación web.


larga explicación:

me escribió una costumbre Settings Provider, que en lugar de leer el archivo de configuración de la aplicación de configuración, se hace la configuración de un servicio de configuración centralizada.

El proveedor personalizado está en un ensamblaje separado para que pueda ser utilizado por las diferentes aplicaciones.

La propiedad ApplicationName debe ser anulada con el nombre del ensamblado de la aplicación.

La forma de utilizar el proveedor es a través de .net custom attribute, por lo que no puedo enviarle ningún parámetro.

Desde fuera del Assembly.Get * Los métodos de ensamblaje parecen funcionar, lo único que se me ocurre es que se requiere una aplicaciónCon el nombre de la aplicación para aplicaciones web, pero no estoy muy contento con eso. Cualquier ayuda con esto se agradece, gracias!

Respuesta

16

Trate

BuildManager.GetGlobalAsaxType().BaseType.Assembly 
+3

obtengo "No se puede llamar a este método durante la etapa de inicialización previa al inicio de la aplicación". error al intentar utilizar este método en ASP.NET MVC. – Tomas

+0

Esto me devuelve "mscorlib". – Slavo

+1

Esto no funciona si no incluye un archivo Global.asax en su proyecto. – Slavo

8

Puede utilizar

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

no está funcionando:/... ApplicationInstance es nula en el método Application Start() (donde se inicializa el proveedor de configuración), y dentro de los controladores devuelve un ensamblado generado raro en tiempo de ejecución (por ejemplo App_global.asax.hiqe17zm, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null) – Pablote

+2

@Pabote: intente obtener el ensamblado de su 'BaseType' (que debe definirse en el código de usuario) – SLaks

+2

Esto no funciona si no incluye un Global archivo .asax en su proyecto. – Slavo

0

Sé que esto es una cuestión de edad, pero esto fue mi acercamiento a una situación algo similar. En mi caso, a usaba otro ensamblaje para formatear una cadena con la versión para mostrar para múltiples programas que tienen el mismo núcleo.

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); 

Debido a que este es un constructor estático todo lo que tenía que hacer era llamar a cualquier propiedad de esta clase estática de la aplicación Web y luego encontrar el montaje última llamada que es diferente de la asamblea que la clase estática es en. Esto se logró con el método 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); 
} 
Cuestiones relacionadas