2010-03-11 104 views
2

我知道這個問題與之前幾個類似,但是我找不到確切的答案。我有一個應用程序框架,除其他外,處理未處理的錯誤。目前,我要求主機應用程序在應用程序的Main方法中調用Register方法來註冊處理程序和各種子系統。我真的想擺脫這種依賴性,並用一些彙編級屬性替換Register方法的參數。所以,我需要的是一種檢測主機應用程序是否已經從我的程序集中啓動的方式 - 就像它是.NET框架的一部分一樣。如何在應用程序啓動時執行彙編代碼

我想避免從主機應用程序或配置文件中的任何特殊行(儘管這些更可接受)的任何顯式調用。因此,只需添加對程序集的引用即可在應用程序啓動時初始化這些功能。有沒有人制定過這種方法?

爲了把事情說清楚,這是我理想的一個例子之前和場景後:

// BEFORE: 
[System.STAThread] 
private static int Main(string[] args) 
{ 
    SupportLibrary.Register(typeof(Program).Assembly, SupportLibrary.ApplicationType.WinForms); 

    // Get the application initialised... 
} 

// AFTER: 
[System.STAThread] 
[SupportLibrary.ApplicationType(SupportLibrary.ApplicationType.WinForms)] 
private static int Main(string[] args) 
{ 
    // Get the application initialised... 
} 

問題的關鍵是,我想擺脫顯式調用的註冊,支持庫中,而是有它們在應用程序啓動並加載支持程序集時隱式註冊。

回答

4

所以,我找到了答案。這可能不適用於任何情況,但它適用於我,因爲我的庫的使用方式意味着它始終在應用程序啓動時加載。 CLR規範提供了要定義的模塊初始化程序。這些被稱爲第一次訪問模塊(例如程序集)並且在任何代碼執行之前 - 這正是我想要的。沒有直接規定在C#中指定這些,但這篇文章:

http://tech.einaregilsson.com/2009/12/16/module-initializers-in-csharp

提供編譯後必要的直接注射IL到您的裝配工具(這是因爲我沒有簽署或obsfuscating對我的作品我的代碼)。我希望能幫助別人。

0

最簡單的方法是使用配置文件 - 只需添加自定義部分,您將編寫所有需要初始化的程序集。比您的主機應用程序將通過該列表,並在您需要的每個程序集上調用Assembly.Load()方法。之後,您可以執行任何必要的初始化(標記在具有自定義屬性的程序集中調用的方法等)。

我不確定是否有辦法(我認爲是)一次加載所有應用程序的程序集。如果你能找到這樣的方式,你可以用suctom屬性標記所有需要初始化的程序集,然後通過加載的所有加載的程序集(AppDomain.CurrentDomain.GetAssemblies())來篩選具有屬性的程序集。

+0

但是,這將需要主機應用程序啓動時執行一些特殊的操作 - 或者我錯過了你的觀點? – 2010-03-11 10:37:33

+0

是的,主機應用程序將不得不執行初始化,但這個代碼應該只寫一次,不需要對其進行更改。在你編寫了這個初始化代碼之後,只有添加對程序集的引用才能使其工作。 – 2010-03-11 11:09:38

相關問題