6

Does anyone know if there's a way to hook into an "OnLoad" event to run some operations when an assembly loads?

Specifically, I am creating a plug-in for an application. The plug-in's DLL gets loaded and objects start being used, but the problem is I need to load another assembly dynamically before anything happens. This assembly can't be copied to the application's directory and must remain invisible to it.

polina-c
  • 6,245
  • 5
  • 25
  • 36
Jeremy Tang
  • 153
  • 1
  • 5
  • possible duplicate of [Are Module initializers supported in Silverlight and Windows Phone 7?](http://stackoverflow.com/questions/5365994/are-module-initializers-supported-in-silverlight-and-windows-phone-7) – Hans Passant Dec 20 '11 at 11:41

3 Answers3

1

It is really sad that writing a Main() function in an Assembly DLL is never called by the .NET framework. It seems that Microsoft forgot that.

But you can easily implement it on your own:

In the DLL assembly you add this code:

using System.Windows.Forms;

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

Then in the Exe Assembly that loads this DLL you add this function:

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);
    }
}

Obviously you should call this function at the very beginning before doing anything else with that Assembly.

Elmue
  • 7,602
  • 3
  • 47
  • 57
1

C# does not provide a way to do that but the underlying IL code does via module initializers. You can use tools like Fody/ModuleInit to turn a specially named static C# class to run as a module initializer which will be run when your dll is loaded.

Scott Chamberlain
  • 124,994
  • 33
  • 282
  • 431
1

You need to hook on to AssemblyLoad event.

Refer- http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyload.aspx

P.K
  • 18,587
  • 11
  • 45
  • 51
  • I did look at that, but that problem is that there is no "Main" function in a class library... I need a place to put that hook in there before any the app tries to instantiate anything. – Jeremy Tang Dec 20 '11 at 05:12