Можно ли написать сборку, которая динамически генерирует/испускает новый класс и исправляет себя, чтобы включить новый класс?
Как?
Можно ли написать сборку, которая динамически генерирует/испускает новый класс и исправляет себя, чтобы включить новый класс?
Как?
Я задал этот вопрос по-другому: Как с помощью AssemblyBuilder сделать все или любую сборку, на которую ссылаются, встроенной, а не связанной в сохраненной сборке?
Исправление существующей dll с помощью динамически сгенерированного кода приведет к тому же результату, что и встраивание исходной dll в динамически сгенерированный код — единая сборка с содержимым обоих.
Думается, так или иначе, для устранения зависимостей и упаковки содержимого нескольких сборок в одну утилита ILMerge является наиболее элегантным решением.
Единственная проблема заключается в том, что типы, сгенерированные в объединенной dll, несовместимы с теми же типами в обеих исходных 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].
Лучший способ сделать это — использовать внедрение зависимостей/инверсию управления или даже простой сервисный локатор.
Ваша новая сборка создаст новую конкретную реализацию и зарегистрирует ее вместо старой реализации.
Я уверен, что что-то более экзотическое было бы действительно ужасным взломом.