6 Stimmen

Einbindung in ein "OnLoad" für die Klassenbibliothek

Weiß jemand, ob es eine Möglichkeit gibt, in ein "OnLoad"-Ereignis einhaken, um einige Operationen ausführen, wenn eine Baugruppe lädt?

Genauer gesagt, ich erstelle ein Plug-in für eine Anwendung. Die DLL des Plug-Ins wird geladen und die Objekte werden verwendet, aber das Problem ist, dass ich eine andere Assembly dynamisch laden muss, bevor etwas passiert. Diese Baugruppe kann nicht in das Verzeichnis der Anwendung kopiert werden und muss für diese unsichtbar bleiben.

0 Stimmen

1voto

P.K Punkte 17959

Sie müssen sich einklinken in AssemblyLoad Veranstaltung.

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

0 Stimmen

Ich habe mir das angesehen, aber das Problem ist, dass es keine "Main"-Funktion in einer Klassenbibliothek gibt... Ich brauche einen Ort, um diesen Haken in dort zu setzen, bevor die App versucht, etwas zu instanziieren.

1voto

Elmue Punkte 6302

Es ist wirklich traurig, dass das Schreiben einer Main()-Funktion in einer Assembly-DLL niemals vom .NET-Framework aufgerufen wird. Es scheint, dass Microsoft das vergessen hat.

Aber Sie können es leicht selbst umsetzen:

In die DLL-Assembly fügen Sie diesen Code ein:

using System.Windows.Forms;

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

In der Exe-Assembly, die diese DLL lädt, fügen Sie dann diese Funktion hinzu:

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

Natürlich sollten Sie diese Funktion ganz am Anfang aufrufen, bevor Sie irgendetwas anderes mit dieser Baugruppe tun.

1voto

Scott Chamberlain Punkte 120610

C# bietet keine Möglichkeit, dies zu tun, aber der zugrunde liegende IL-Code tut dies über Modul-Initialisierer . Sie können Tools verwenden wie Fody/ModuleInit um eine speziell benannte statische C#-Klasse als Modulinitialisierer auszuführen, der beim Laden Ihrer DLL ausgeführt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X