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

Можно ли запускать некоторый код при загрузке сборки, не делая ничего конкретного в коде загрузки? То, что я ищу, похоже на статический конструктор типа.

Например:

Ассамблея A не знает о сборке B, но B знает об A. Ассамблея A должна знать некоторые вещи о B, если B загружена. Когда assembly B загружается средой выполнения (ссылка или явная), я хочу, чтобы часть кода (статический метод или атрибут) выполнялась, которая вызывает метод в сборке A.

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

CLR поддерживает инициализаторы модhive . Вам придется взломать код C ++ / CLI или файл ilasm.exe, чтобы использовать их.

(edit – применяется к C #; для подхода C ++ см. этот ответ )

В принципе, нет: вы не можете. Это была бы огромная поверхность атаки и не допускается. Возможно, вы захотите поставить статический ctor на некоторые из типов B, которые гарантируют выполнение кода инициализации, но это о нем …

Вы можете использовать статические конструкторы в .Net, но, к сожалению, они не делают то, что вы хотите. Статические конструкторы выполняются только перед использованием типа. Подробнее см. http://msdn.microsoft.com/en-us/library/k9x6w0hc(VS.80).aspx .

Вы можете получить некоторый пробег от подписки на событие AssemblyLoad в AppDomain. См. http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyload.aspx .

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

Существует три варианта инициализации сборки .NET:

  1. Вы пишете статическую функцию Init () или Main () в своей сборке для инициализации и вызываете эту функцию путем отражения от кода C #, который загружает эту сборку.
  2. Напишите управляемую сборку C ++, где вы поместите свой код в DllMain (). Будьте осторожны, потому что ваш код будет выполнен в Locker Lock, где запрещено несколько вещей (например, загрузка других DLL, …). Но вы можете начать новый stream, который делает ЛЮБЫЕ вещи инициализации. (О LoaderLock: https://msdn.microsoft.com/en-us/library/ms173266.aspx ) (О DllMain: C # в C ++ / CLI в C DLL System.IO.FileNotFoundException )
  3. Вы собираете чистую сборку C # и изменяете скомпилированную DLL, чтобы добавить код инициализатора модуля, как описано здесь: http://einaregilsson.com/module-initializers-in-csharp/ Недостатком этого метода является то, что функция инициализации не вызывается немедленно, когда assembly загружена в процесс. Но это вызвано прежде, чем что-либо еще в сборке будет впервые доступно.

Вероятно, вы должны вернуться к своему сериализационному подходу для смягчения этой проблемы. Если вы сериализуете использование атрибута ISerializable и SerializableAttribute , вы можете сделать так, чтобы график сериализации загружал сборку B, когда это необходимо, без сборки. Когда-либо нужно было явно знать о сборке B.

Используя смешанную сборку, вы можете запустить DllMain на сборку.

  • Как загрузить сборку во время выполнения перед событием AssemblyResolve?
  • Как я могу просмотреть MSIL / CIL, сгенерированный компилятором C #? Почему это называется сборкой?
  • Вызов функции стандартной библиотеки C из asm в Visual Studio
  • C # компиляция для 32/64 бит или для любого процессора?
  • Самый быстрый способ вычисления 128-битного целого по модулю 64-разрядного целого числа
  • Как использовать строки в emu8086
  • Цикл с вызовом функции быстрее, чем пустой цикл
  • Почему медленная инструкция цикла? Не удалось ли Intel эффективно внедрить его?
  • Сделать муравей тихий без флага -q?
  • Могу ли я загрузить сборку .NET во время выполнения и создать экземпляр типа, зная только имя?
  • C #: зачем подписывать сборку?
  • Interesting Posts

    Как сопоставить объекты XML с C #

    Можете ли вы писать виртуальные функции / методы на Java?

    Аккордеонная ячейка таблицы – Как динамически расширять / сокращать uitableviewcell?

    Импорт android.support не может быть разрешен

    (Неизвестный источник) в трассировке стека исключений

    Значение отрицательной переменной Sass?

    Обратный отсчет Android ProgressBar

    Масштабирование и прокрутка в SpriteKit

    Можно ли отслеживать MAC-адрес?

    Как кодировать мультимедийные запросы CSS, предназначенные для ВСЕХ мобильных устройств и планшетов?

    Каков максимальный размер кучи по умолчанию для JVM Sun от Java SE 6?

    Почему std :: vector :: operator от 5 до 10 раз быстрее, чем std :: vector :: at ()?

    Сделать Chrome автоматически загружать небезопасный контент для определенных страниц / веб-сайтов

    Как добавить верхние и нижние колонтитулы HTML на страницу?

    Могу ли я дать UIToolBar собственный фон в моем приложении для iPhone?

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