2011-12-20 99 views
3

有誰知道是否有方法掛鉤到「OnLoad」事件中以在程序集加載時運行某些操作?掛鉤到類庫的「OnLoad」

具體來說,我正在爲應用程序創建一個插件。插件的DLL被加載並開始使用對象,但問題是我需要在發生任何事情之前動態加載另一個程序集。該程序集不能被複制到應用程序的目錄中,並且必須保持不可見。

+0

[是否支持Silverlight和Windows Phone 7中的模塊初始值設定項?](http://stackoverflow.com/questions/5365994/are-module-initializers-supported-in-silverlight-and-windows-phone- 7) – 2011-12-20 11:41:54

回答

1

這是很可悲的是寫在大會DLL中的main()函數從不由.NET框架調用。 似乎微軟忘記了這一點。

但是你可以很容易地實現它你自己:在加載這個DLL添加此功能的exe大會

using System.Windows.Forms; 

public class Program 
{ 
    public static void Main() 
    { 
     MessageBox.Show("Initializing"); 
    } 
} 

然後:

在DLL組件添加此代碼

using System.Reflection; 

void InitializeAssembly(Assembly i_Assembly) 
{ 
    Type t_Class = i_Assembly.GetType("Program"); 
    if (t_Class == null) 
     return; // class Program not implemented 

    MethodInfo i_Main = t_Class.GetMethod("Main"); 
    if (i_Main == null) 
     return; // function Main() not implemented 

    try 
    { 
     i_Main.Invoke(null, null); 
    } 
    catch (Exception Ex) 
    { 
     throw new Exception("Program.Main() threw exception in\n" 
          + i_Assembly.Location, Ex); 
    } 
} 

顯然你應該在開始使用該程序集之前先調用此函數。

0

C#沒有提供這樣做的方法,但底層的IL代碼通過module initializers來完成。你可以使用像Fody/ModuleInit這樣的工具來將一個特殊命名的靜態C#類作爲一個模塊初始化程序來運行,它將在你的dll被加載時運行。