Как принудительно инициализировать модуль, когда в основной исполнительной сборке нет типов?

Пакет ModuleInit.Fody NuGet используется для внедрения IL-кода для вызова ModuleInitializer.Initialize().

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

Прямой вызов Assembly.Load("OtherAssemblyName") не запускает инициализацию.

Итак, как инициализировать модуль в сборке, на которую ссылаются, без использования какого-либо типа из этой сборки?


person Lessneek    schedule 20.01.2014    source источник


Ответы (2)


У вас есть 2 варианта:

1) Используйте фиктивный Console.WriteLine(typeof(SomeTypeInsideTheAssembly).FullName);

2) Если вам нужно более универсальное решение, вы можете использовать помощника для предварительной загрузки сборок в ваш домен приложения. Пример можно найти по адресу:

https://github.com/Catel/Catel/blob/447f8a428fea5cb5087e97b8c58ac7cad969400a/src/Catel.Core/Catel.Core.NET40/Reflection/Extensions/AppDomainExtensions.cs#L63

person Geert van Horrik    schedule 20.01.2014

Что я делаю в таких случаях, так это объявляю класс «инициализатора сборки», который распознается вызывающей сборкой (выберите любое соглашение, которое вам нравится: предопределенное имя, украшенное настраиваемым атрибутом [AssemblyInitializer], реализующий интерфейс, все, что вам подходит ). Затем сборка, загружающая другую, ищет этот класс "инициализатор сборки" и вызывает его статический конструктор (или создает его экземпляр, опять же, что вам подходит).

Еще немного пояснений, почему я предпочитаю этот способ: в таких случаях загружаемая сборка обычно должна самостоятельно зарегистрировать некоторые типы в реестре общих типов (например, контейнер IoC), зарегистрировать какое-то событие обработчики или выполнить любую другую начальную загрузку, типичную для надстроек или других модульных архитектур. Наличие согласованного подхода «инициализатор сборки» дает такую ​​централизованную, глобальную возможность вызывать такие загрузчики.

Хорошей идеей является hook- в процесс разрешения сборки и вызывать «инициализаторы сборки» из центрального прозрачного места. Однако вам нужно пропустить системные сборки и не забыть обработать уже загруженные сборки после установки вашего механизма инициализации.

person Ondrej Tucny    schedule 20.01.2014