Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hooking into an "OnLoad" for class library

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.

like image 581
Jeremy Tang Avatar asked Dec 20 '11 04:12

Jeremy Tang


2 Answers

You need to hook on to AssemblyLoad event.

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

like image 62
P.K Avatar answered Oct 15 '22 13:10

P.K


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.

like image 29
Elmue Avatar answered Oct 15 '22 13:10

Elmue