Estoy fusionando varios ensamblados .NET utilizando ILMerge, incluidos algunos ensamblados de terceros. Desde entonces, he experimentado varios errores que se reducen al hecho de que las definiciones de tipos están vinculadas al ensamblado en el que están definidas.Definiciones de tipo .NET en conjuntos fusionados (ILMerge)
Un ejemplo simple es la definición de sección de configuración de log4net en mi App.config. Utiliza type = "log4net.Config.Log4NetConfigurationSectionHandler, log4net", que no funcionará dado que el ensamblado log4net no existe una vez que se ha fusionado en mi ensamblado fusionado. Aunque no es un gran problema, cambio el nombre del ensamblaje a mi ensamblado combinado y funciona bien.
Un ejemplo un poco más complicado es el de los tipos serializados binarios. Mi sistema usa serialización binaria para enviar ciertos objetos entre procesos. Todos los objetos serializables se definen en un conjunto común al que hacen referencia todos los demás proyectos. Estaba usando la serialización binaria predeterminada, pero comenzó a fallar al deserializar los objetos con el error que indicaba que no podía encontrar el ensamblado fusionado que serializaba el objeto. Nuevamente, no es gran cosa, implementé una SerializationBinder personalizada que busca el tipo en cualquier ensamblaje cargado, no solo el que se proporciona.
El ejemplo anterior se volvió más complicado cuando el tipo serializado hace referencia a otros tipos serializables. Continué encontrándome con más y más problemas que son cada vez más difíciles de manejar.
El punto que trato de entender aquí es que el sistema de tipo .NET e ILMerge no parecen funcionar bien juntos. ¿Alguien tiene alguna experiencia con la forma en que han resuelto este problema? ¿Es posible decirle al tiempo de ejecución de .NET que no me importa en qué ensamblaje el tipo dice que debería estar, simplemente búscalo en cualquier lugar?
NOTA: Por favor, no responda preguntándome por qué estoy fusionando ensamblajes, ese no es el punto de esta pregunta.
WAG: ¿Ya probé el DataContractSerializer? No podrá hacerlo con NetDataContractSerializer porque está vinculado a los tipos, pero el viejo DCS simple debería funcionar para usted ... – Will