2011-10-04 19 views
11

我想在從另一個程序集實例化類庫時執行某些代碼。是否有類庫的入口點或引導程序?我認爲一個靜態方法主要會做的伎倆,但我錯了。 這可能是配置和實例化記錄器單例,未處理的異常處理程序等。c#中的類庫有相當於Application_Start嗎?

+2

你正在尋找一個模塊初始化,這不是C#支持。 – SLaks

+1

你可以提供一個單一的入口點到類庫中嗎,比如一個靜態類工廠,你必須調用這個工廠才能從庫中獲得任何有用的實例?然後,您可以在首次調用靜態類工廠時進行初始化。 – mellamokb

+0

難道你不能只使用你知道會從該程序集中加載的某個類的靜態構造函數嗎? – svick

回答

0

AppDomain.AssemblyLoad Event加載程序集時發生。可能這可以用來在你的類庫中調用初始化方法。

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.. 
} 

下面是兩個類似的線程

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

.Net: Running code when assembly is loaded

+0

你確定這會工作嗎?我假設你將在一個靜態構造函數中訂閱它。如果是這樣的話,我認爲事件會在靜態構造函數運行之前觸發。 – svick

+0

不太確定他們會以何種順序發射。但是,這可以用於在應用程序中設置標誌或調用類庫中的初始化方法。 – CharithJ

1

你進去看了PreApplicationStartMethodAttribute

using System.Web; 

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

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

更多細節:http://dochoffiday.com/professional/simulate-application-start-in-class-library

+3

這隻適用於asp.net應用程序,並且不會在類庫測試項目的上下文中工作。在文檔中沒有任何關於它的內容,但是在我嘗試了這一點並且探究支持以調用[WebActivator文檔]的ASP.NET部分之外的啓動方法(https://github.com/davidebbo/WebActivator/ blob/master/README.markdown)在內部使用'PreApplicationStartMethodAttribute' –

+2

因爲問題不是關於ASP.NET的,因此被退出。 – StefanLundmark