Есть ли эквивалент Application_Start для библиотеки классов в С #

Я хотел бы выполнить определенный код в библиотеке классов, когда он создается из другой сборки. Есть ли точка входа или начальная загрузка для библиотеки классов? Я думал, что статический метод Main поможет, но ошибался.

Приложения для этого могут настраивать и создавать экземпляры синглтона регистратора, обработчика необработанных исключений и т. Д.


person Diego    schedule 04.10.2011    source источник
comment
Вы ищете инициализатор модуля, который не поддерживается C #.   -  person SLaks    schedule 05.10.2011
comment
Можете ли вы предоставить единую точку входа в библиотеку классов, скажем, фабрику статических классов, которую вы должны вызвать, чтобы получить любой полезный экземпляр из библиотеки? Затем вы можете выполнить инициализацию при первом вызове фабрики статических классов.   -  person mellamokb    schedule 05.10.2011
comment
Разве вы не можете просто использовать статический конструктор какого-то класса, который, как вы знаете, будет загружен из этой сборки?   -  person svick    schedule 05.10.2011
comment
основной метод   -  person    schedule 08.11.2019


Ответы (4)


Библиотека как таковая не имеет отправной точки. Когда вы создаете экземпляр класса библиотеки, первая вызываемая вами инструкция - это конструктор класса (новый) и его базовые конструкторы, если они находятся в определении конструктора.

person Ixer    schedule 02.01.2020

Событие AppDomain.AssemblyLoad, которое происходит, когда сборка загружен. Вероятно, это можно использовать для вызова метода инициализации в вашей библиотеке классов.

public static void Main() 
{
    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.AssemblyLoad += new AssemblyLoadEventHandler(MyAssemblyLoadEventHandler);
}

static void MyAssemblyLoadEventHandler(object sender, AssemblyLoadEventArgs args) 
{
      Console.WriteLine("ASSEMBLY LOADED: " + args.LoadedAssembly.FullName);
      //If this is the assembly that you want to call an initialize method..
}

Ниже две похожие темы

как написать обработчик событий загрузки / инициализации сборки библиотеки класса < / а>

.Net: запуск кода при загрузке сборки

person CharithJ    schedule 04.10.2011
comment
Вы уверены, что это сработает? Я предполагаю, что вы подпишетесь на него в статическом конструкторе. Если это так, я думаю, что событие сработает до запуска статического конструктора. - person svick; 05.10.2011
comment
Не совсем уверен, в каком порядке они будут стрелять. Однако это можно использовать для установки флага в приложении или для вызова метода инициализации в библиотеке классов. - person CharithJ; 05.10.2011

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

Когда сборка загружена, среда CLR использует множество механизмов для выполнения этой работы, начиная с того, как внутренняя платформа предназначена для загрузки модулей, вплоть до самой среды CLR. У каждого задействованного актера есть свои ограничения.

Выполнение кода при загрузке модуля - не лучшая практика для Win32 по той же причине: вы не можете знать, что делает вызывающий; Кроме того, внесенные вами изменения могут изменить текущий домен приложения, но не могут быть распространены на все другие домены приложений приложения.

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

Все остальные ответы частично решают проблему, но могут вызвать нежелательные побочные эффекты и недетерминированное поведение.

person Yennefer    schedule 28.10.2019

Вы изучили PreApplicationStartMethodAttribute?

using System.Web;

[assembly: PreApplicationStartMethod(typeof(ClassLibrary.Startup), "Start")]

namespace ClassLibrary
{
    public class Startup
    {
        public static void Start()
        {
            // do some awesome stuff here!
        }
    }
}

Подробнее: http://dochoffiday.com/professional/simulate-application-start-in-class-library

person dochoffiday    schedule 30.12.2013
comment
это будет работать только в приложении asp.net и не будет работать, например, в контексте тестового проекта библиотеки классов. В документации об этом ничего не говорится, но это стало очевидным после того, как я попробовал это и изучил поддержку для вызова методов запуска вне части ASP.NET документация WebActivator, которая использует PreApplicationStartMethodAttribute внутри - person Leonid Vasilev; 01.07.2015
comment
Проголосовал против, потому что вопрос не касался ASP.NET. - person StefanLundmark; 30.07.2016