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

У меня библиотека 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.

  • Как определить, была ли assembly .NET построена для x86 или x64?
  • C #: зачем подписывать сборку?
  • Очень быстро memcpy для обработки изображений?
  • Как точно работает инструкция x86 LOOP?
  • Загрузка нескольких версий одной и той же сборки
  • Размер сборки .NET влияет на производительность?
  • C # компиляция для 32/64 бит или для любого процессора?
  • Как загрузить сборку во время выполнения перед событием AssemblyResolve?
  • Maven: добавьте зависимость к банке относительным путем
  • .NET Assembly Diff / Compare Tool - Что доступно?
  • Visual Studio «Не удалось скопировать» ... во время сборки
  • Interesting Posts

    Предел пропускной способности по порту на iptables

    Разница между System.load () и System.loadLibrary в Java

    AES получает разные результаты в iOS (Obj-C) и Android (Java)

    Являются ли сценарии оболочки чувствительными к кодированию и окончаниям строк?

    Java-способ проверить, является ли строка палиндром

    Могу ли я улучшить проверку регулярного выражения для действительных доменных имен?

    Unix «$ @» в качестве параметра

    Чтение / запись файла .txt со специальными символами

    Где я должен делать инъекцию с помощью Ninject 2+ (и как я могу упорядочить свои модули?)

    Получить все элементы управления определенного типа

    Программное обеспечение автоматической маркировки музыки

    Предупреждения Firefox «Неверное подключение» при посещении уважаемых сайтов HTTPS при использовании учетной записи ребенка

    Обработать DBNull в C #

    Как использовать векторные чертежи в Android API ниже 21?

    Почему обновления для автозагрузки всегда выходят из строя на моем компьютере?

    Давайте будем гением компьютера.