Подключение к OnLoad для библиотеки классов - PullRequest
3 голосов
/ 20 декабря 2011

Кто-нибудь знает, есть ли способ подключить событие OnLoad для запуска некоторых операций при загрузке сборки?

В частности, я создаю плагин для приложения. DLL плагина загружается, и объекты начинают использоваться, но проблема в том, что мне нужно динамически загрузить другую сборку, прежде чем что-либо произойдет. Эта сборка не может быть скопирована в каталог приложения и должна оставаться невидимой для него.

Ответы [ 3 ]

1 голос
/ 07 января 2015

Очень печально, что написание структуры Main () в сборочной DLL никогда не вызывается .NET Framework.Кажется, что Microsoft забыла об этом.

Но вы можете легко реализовать это самостоятельно:

В сборку DLL вы добавляете этот код:

using System.Windows.Forms;

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

ЗатемExe Assembly, которая загружает эту 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);
    }
}

Очевидно, вы должны вызвать эту функцию в самом начале, прежде чем делать что-то еще с этой сборкой.

1 голос
/ 20 декабря 2011

Вам необходимо подключиться к событию AssemblyLoad.

Лите- http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyload.aspx

0 голосов
/ 22 ноября 2017

C # не обеспечивает способ сделать это, но базовый код IL делает через инициализаторы модуля . Вы можете использовать такие инструменты, как Fody / ModuleInit , чтобы превратить статический класс C # со специальным именем для запуска в качестве инициализатора модуля, который будет запускаться при загрузке вашей dll.

...