Инициализировать библиотеку при загрузке сборки

У меня библиотека DLL библиотеки .net, которая действует как функциональная библиотека. Существует множество статических типов наряду со статическими методами.

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

Когда assembly загружается, есть ли способ обеспечить выполнение определенного метода? Что-то вроде AppDomain.AssemblyLoad, но вызываемое автоматически из самой сборки. Я думал, что может быть что-то вроде AssemblyAttribute, который можно использовать?

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

Благодаря!

Зачем вам нужны все данные для загрузки до того, как они будут использованы, а не только когда нужен первый тип, который ему нужен?

Я не думаю, что есть какой-либо способ заставить метод запускаться на сборке, изнутри сборки. Вы могли бы поставить статический конструктор в каждом типе, но, откровенно говоря, я считаю, что просто имеет смысл иметь один тип, представляющий эти данные и предоставляющий ему доступ, – и ставить статический конструктор только в этом типе. (Если у вас есть отдельные биты данных, которые можно использовать независимо, возможно, для них создаются отдельные типы.)

Да, есть – вроде.

Используйте отличную небольшую утилиту от Einar Egilsson, InjectModuleInitializer .

Запустите этот исполняемый файл как шаг пост-сборки, чтобы создать небольшую функцию .cctor (функцию инициализатора модуля), которая вызывает статическую функцию void, которая не принимает никаких параметров. Было бы неплохо, если бы компилятор дал нам возможность создавать .cctor (), к счастью, нам редко нужна эта возможность.

Однако это не полная замена DllMain. CLR только вызывает эту функцию .cctor до любых методов, вызванных в вашей сборке, а не при сборке. Итак, если вам нужно что-то сделать при сборке, вам нужно, чтобы код загрузки вызывал метод напрямую или использовал хак, я подробно https://stackoverflow.com/a/9745422/240845

Следующее решение возможно только тогда, когда вы контролируете основную сборку, то есть не подходит для автономных библиотек, предназначенных для распространения

У меня была аналогичная проблема и она была решена путем создания ассемблерного атрибута ‘InitializeOnLoad’ с параметром Type. Затем, в основном исполняемом файле, я добавил тривиальный обработчик AppDomain.AssemblyLoaded, который сканирует недавно загруженную сборку для вышеупомянутого атрибута и вызывает на них System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor ().

 [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] public class InitializeOnLoadAttribute : Attribute { Type type; public InitializeOnLoadAttribute(Type type) { this.type = type; } public Type Type { get { return type; } } } // somewhere very early in main exe initialization AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(AssemblyInitializer); static void AssemblyInitializer(object sender, AssemblyLoadEventArgs args) { // force static constructors in types specified by InitializeOnLoad foreach (InitializeOnLoadAttribute attr in args.LoadedAssembly.GetCustomAttributes(typeof(InitializeOnLoadAttribute), false)) System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(attr.Type.TypeHandle); } 

Кроме того, если вы опасаетесь, что сборки могут быть отжаты, прежде чем перехватить событие AssemblyLoad, вы можете просто запустить AppDomain.GetAssemblies () и вызвать для них «инициализатор».

Это возможно – просто добавьте статический конструктор в class . Однако я не знаю, как это сделать без модификации IL.

  • Как использовать строки в emu8086
  • Не удалось загрузить файл или сборку HRESULT: 0x80131515 (При добавлении controllerа в проект MVC с ссылками на сборку на сетевом диске)
  • Как загрузить сборку во время выполнения перед событием AssemblyResolve?
  • Эффективное умножение матрицы 4x4 (C vs assembly)
  • Maven: добавьте зависимость к банке относительным путем
  • .Net: Запуск кода при загрузке сборки
  • Как я могу просмотреть MSIL / CIL, сгенерированный компилятором C #? Почему это называется сборкой?
  • Почему XCHG reg, reg 3 инструкции по микрооперации на современных архитектурах Intel?
  • .NET Assembly Diff / Compare Tool - Что доступно?
  • Сколько циклов процессора требуется для каждой инструкции сборки?
  • Возможно ли «декомпилировать» Windows .exe? Или, по крайней мере, рассмотреть Ассамблею?
  • Давайте будем гением компьютера.