2011-10-04 9 views
11

Me gustaría ejecutar cierto código en una biblioteca de clases cuando se crea una instancia desde otro ensamblado. ¿Hay un punto de entrada o arranque para una biblioteca de clases? Pensé que un método estático Main haría el truco, pero estaba equivocado. Las aplicaciones para esto pueden ser la configuración y la creación de instancias de un registrador de singleton, controlador de excepción no controlada, etc.¿Existe un equivalente de Application_Start para una biblioteca de clases en C#

+2

Usted está buscando un inicializador módulo, que no es compatible con C#. – SLaks

+1

¿Puede proporcionar un único punto de entrada a la biblioteca de la clase, por ejemplo, una fábrica de clases estática a la que debe llamar para obtener cualquier instancia útil de la biblioteca? Entonces podría hacer su inicialización en la primera llamada a la fábrica de clases estática. – mellamokb

+0

¿No puedes simplemente usar un constructor estático de alguna clase que sabes que se cargará desde ese ensamblado? – svick

Respuesta

0

AppDomain.AssemblyLoad Event que se produce cuando se carga un ensamblaje. Probablemente se pueda usar para invocar un método de inicialización en la biblioteca de su clase.

public static void Main() 
{ 
    AppDomain currentDomain = AppDomain.CurrentDomain; 
    currentDomain.AssemblyLoad += new AssemblyLoadEventHandler(MyAssemblyLoadEventHandler); 
} 

static void MyAssemblyLoadEventHandler(object sender, AssemblyLoadEventArgs args) 
{ 
     Console.WriteLine("ASSEMBLY LOADED: " + args.LoadedAssembly.FullName); 
     //If this is the assembly that you want to call an initialize method.. 
} 

A continuación se presentan dos hilos similares

how to write class lib's assembly load/init event handler

.Net: Running code when assembly is loaded

+0

¿Estás seguro de que funcionará? Supongo que se suscribirá a él en un constructor estático. Si ese es el caso, creo que el evento se activará antes de que se ejecute el constructor estático. – svick

+0

No estoy seguro de en qué orden dispararían. Sin embargo, esto se puede usar para establecer un indicador en la aplicación o para llamar al método de inicialización en la biblioteca de la clase. – CharithJ

1

¿Has mirado en el PreApplicationStartMethodAttribute?

using System.Web; 

[assembly: PreApplicationStartMethod(typeof(ClassLibrary.Startup), "Start")] 

namespace ClassLibrary 
{ 
    public class Startup 
    { 
     public static void Start() 
     { 
      // do some awesome stuff here! 
     } 
    } 
} 

más detalle: http://dochoffiday.com/professional/simulate-application-start-in-class-library

+3

esto funcionará solo dentro de la aplicación asp.net y no funcionará en el contexto del proyecto de prueba de biblioteca de clase, por ejemplo. No hay nada de eso en la documentación, pero se hizo obvio después de que probé esto y exploré Support para invocar los métodos de inicio fuera de la parte de ASP.NET de [documentación de WebActivator] (https://github.com/davidebbo/WebActivator/ blob/master/README.markdown) que usa 'PreApplicationStartMethodAttribute' internamente –

+2

Votado abajo porque la pregunta no era sobre ASP.NET. – StefanLundmark

Cuestiones relacionadas