Можно ли написать сборку, которая динамически генерирует новый класс и исправляет себя новым классом? - PullRequest
4 голосов
/ 20 мая 2009

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

Как?

Ответы [ 2 ]

2 голосов
/ 21 мая 2009

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

Исправление существующей библиотеки DLL с помощью динамически сгенерированного кода приведет к тому же, что и встроение исходной библиотеки DLL в динамически сгенерированный код - единственная сборка с содержимым обоих.

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

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

Другими словами: Класс A в [dll_generator] ссылается на [dll_1]. Класс A генерирует [dll_2], который основан и, конечно, также ссылается на [dll_1]. Класс A вызывает ILMerge для объединения [dll_2] с зависимостью [dll_1] для получения [dll_merged]. Ни один из типов в [dll_merged] не совместим ни с одним из их исходных типов в [dll_1] и [dll_2], поэтому, если класс A загружает [dll_merged] и пытается что-либо с ним сделать, включая имена литеральных типов из исходной ссылки на [ dll_1], это терпит неудачу, потому что типы несовместимы. Единственный способ, которым класс A может работать с типами в [dll_merged], - это загружать их по имени и полностью работать с объектами 'Type' и отражением - или динамически компилировать исходный код для нового [dll_merged].

1 голос
/ 20 мая 2009

Лучший способ сделать это - использовать внедрение зависимостей / инверсию управления или даже простой сервисный локатор.

Ваша новая сборка создаст новую конкретную реализацию и зарегистрирует ее вместо старой реализации.

Я уверен, что что-нибудь более экзотическое действительно будет ужасным хаком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...