有誰知道是否有方法掛鉤到「OnLoad」事件中以在程序集加載時運行某些操作?掛鉤到類庫的「OnLoad」
具體來說,我正在爲應用程序創建一個插件。插件的DLL被加載並開始使用對象,但問題是我需要在發生任何事情之前動態加載另一個程序集。該程序集不能被複制到應用程序的目錄中,並且必須保持不可見。
有誰知道是否有方法掛鉤到「OnLoad」事件中以在程序集加載時運行某些操作?掛鉤到類庫的「OnLoad」
具體來說,我正在爲應用程序創建一個插件。插件的DLL被加載並開始使用對象,但問題是我需要在發生任何事情之前動態加載另一個程序集。該程序集不能被複制到應用程序的目錄中,並且必須保持不可見。
您需要登錄到AssemblyLoad
事件。
Refer- http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyload.aspx
我確實看過,但問題是在類庫中沒有「Main」函數......我需要一個地方在任何應用程序嘗試實例化任何東西之前將該鉤子放在那裏。 – 2011-12-20 05:12:18
這是很可悲的是寫在大會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);
}
}
顯然你應該在開始使用該程序集之前先調用此函數。
C#沒有提供這樣做的方法,但底層的IL代碼通過module initializers來完成。你可以使用像Fody/ModuleInit這樣的工具來將一個特殊命名的靜態C#類作爲一個模塊初始化程序來運行,它將在你的dll被加載時運行。
[是否支持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