2014-01-20 1 views
1

Модуль ModuleInit.Fody NuGet используется для инъекции IL-кода для вызова ModuleInitializer.Initialize().Как принудительно инициализировать модуль, если в основной сборке нет типов?

Если в основной сборке нет типов, другая ссылочная сборка не инициализируется ModuleInitializer. Используется только в случае какого-либо типа из ссылочной сборки.

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

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

ответ

1

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

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

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

1

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

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

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

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