Я задал этот вопрос по-другому: Используя 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].