El desarrollo de Winform/wpf inevitablemente se refiere a muchas DLLs de terceros, pero cada vez que lo empaquetas, necesitas copiar los archivos del directorio de Depuración al cliente o compartirlos, lo cual no es muy cómodo de usar. He probado varios programas para fusionar archivos dll antes, como ILMerge, Enigma Virtual Box, etc., pero hasta que no aprendí sobre "Costura.Fody", sentía que el mundo era mucho mejor~
Lo siguiente es un programa escrito por Winform, que hace referencia a las dos DLLs "HttpHelper.dll" y "Newtonsoft.Json.dll"; cuando generemos el programa, habrá un archivo exe y estos dos archivos DLL, lo que incomoda mucho a la gente, y si hay una DLL menos, el programa puede reportar una excepción, como se muestra en la figura siguiente:
El enlace de abajo es el uso anterior (no recomendado)
Usando la herramienta Costura.Fody, puedes fusionar la DLL de origen con el EXE objetivo
Página principal del proyecto: https://github.com/Fody/Costura
Cómo usar e instalar directamente el paquete Nuget:
Una vez que hayas añadido con éxito Costura.Fody, la solución añadirá automáticamente FodyWeavers.xml archivo.
Regenera la solución, puedes ver tu éxito en el directorio de generación del programa, todas las DLLs están perfectamente integradas en el exe, puedes copiar directamente el archivo exe al cliente para que lo ejecute de forma independiente. Como se muestra a continuación:
1>------ Todas las reconstrucciones ya han comenzado: Proyecto: itsvse, Configuración: Depurar cualquier CPU ------ 1> Fody: Fody (versión 2.0.0.0) Ejecutándose 1> Fody/Costura: No se encontró referencia a 'Costura.dll'. Referencias no modificadas. 1> Fody/Costura: Incrustar 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Incrustar 'E:\project\itsvse\itsvse\Newtonsoft.Json.dll' 1> Fody: Terminé Fody 609ms. 1> Fody: Omití el ensamblador de verificación porque está deshabilitado en configuración 1> Fody: Terminé la verificación en 3 ms. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Regenera todo: 1 tiene éxito, 0 falla y 0 ========== se omite
Como se puede ver en la imagen anterior, el archivo generado no contiene Newtonsoft.Json.dll, HttpHelper.dll y Costura.dll no se generan, solo dos archivos, itsvse.exe pueden ejecutarse directamente sin errores. (El archivo PDB puede eliminarse).
Utilicemos la herramienta ILSpy para descompilar nuestro programa y echar un vistazo al código fuente generado, como se muestra en la figura siguiente:
Introducción al principio de implementación
Cuando el CLR intenta cargar un ensamblador pero no lo consigue, genera el evento AppDomain.AssemblyResolve. Nuestro programa puede escuchar este evento y devolver el ensamblador que el CLR intenta cargar en el gestor de eventos para que el programa pueda seguir funcionando normalmente.
Fody.Costura incrusta todas las DLLs referenciadas por el EXE en el archivo EXE al construir el proyecto. Cuando un programa utiliza una de estas DLL durante la ejecución (el evento AppDomain.AssemblyResolve se activa porque el CLR no puede encontrar el archivo DLL), se extrae la DLL requerida de los recursos incrustados del archivo EXE.
Puedes ver que el método Attach escucha el evento AppDomain.AssemblyResolve. Cuando el CLR no carga correctamente un ensamblador, se ejecuta el gestor de eventos AssemblyResolve. AssemblyResolve intenta obtener el ensamblaje destino del recurso incrustado del ensamblador cargado mediante el método Common.ReadFromEmbeddedResources y lo devuelve al CLR.
Viendo esto, quizá te preguntes, ¿cuándo se implementó el método Attach?
De hecho, para el lenguaje C#, el CLR oculta un gran truco: puede ejecutar código inicializado antes de que se cargue cada módulo (cada ensamblador contiene uno o más módulos). Desafortunadamente, el lenguaje C# no tiene control sobre esta parte del código. Fody.Costura inyecta código IL directamente en la función de inicialización del módulo interno del ensamblaje EXE, y esta parte del código IL ejecuta realmente el método Attach. De este modo, una vez cargado el ensamblado EXE, se puede llamar inmediatamente al método Attach.
Lo anterior es una breve introducción al principio de implementación de Fody.Costura.
Configuración avanzada
Estas configuraciones se añaden o modifican en CosturaFodyWeavers.xml archivos.
CrearasasambleaTemporales Defecto: falso Esto incrusta el archivo incrustado en el disco antes de cargarlo en la memoria. Esto es útil en ciertos escenarios en los que quieres cargar un ensamblador desde un archivo físico.
IncluyeDeSymbols Default: verdadero Controla si los .pdbs del ensamblaje de referencia también están embebidos.
Desactivación Compresión Defecto: falso Los ensamblajes embebidos se comprimen por defecto y se descomprimen cuando se cargan. Puedes desactivar la compresión usando esta opción. Nota: Asegúrate de desactivar esta propiedad al referenciar DLLs no estándar o DLLs cifradas. De lo contrario, esto llevará a la situación en la que el exe no podrá abrirse. Esto se descubrió cuando estaba usando DSkin.dll.
DisableCleanup Defecto: falso Como parte de Costura, los componentes integrados ya no se incluyen en la compilación. Esta limpieza se puede desactivar.
LoadAtModuleInit Default: verdadero Costura se carga por defecto como parte de la inicialización del módulo. La bandera desactiva el comportamiento. Asegúrate de poder usar CosturaUtility.Initialize() en algún sitio.
ExcludeAssemblies Cómo usar: ExcludeAssemblies="DLL1| DLL2" Una lista de nombres de ensamblador para excluir de la acción predeterminada de "incrustar todas las referencias locales de copia".
IncluyeAsambleas Cómo usar: IncludeAssemblies="DLL1| DLL2" Una lista de nombres de ensamblador incluidos en la acción predeterminada de Incrustar Todas las Referencias Locales de Copia.
Asambleas no gestionadas32 y asambleas no gestionadas64 Cómo usarlo: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Los ensamblajes de modo mixto no pueden cargarse de la misma manera que los ensamblajes gestionados. Por lo tanto, para ayudar a Costura a identificar qué componentes están en modo mixto y en qué entornos cargarlos, sus nombres deberían incluirse en una o ambas listas. No incluyas .exe ni .dll en el nombre.
Preload Order Uso: PreloadOrder="DLL1| DLL2" Las bibliotecas locales pueden cargarse automáticamente mediante Costura. Para incluir una biblioteca local, inclúyela en tu proyecto como un recurso incrustado llamado carpeta costura32 o costura64, dependiendo de la inestabilidad de la biblioteca. Alternativamente, puedes especificar el orden de carga en el que se cargan las bibliotecas precargadas. Cuando mezclas componentes temporales del disco, también están precargados.
CosturaUtility Cómo usar:
CosturaUtility es una clase que te permite inicializar manualmente el sistema Costura en tu propio código.Esto es principalmente para escenarios en los que el programa de inicialización de módulos no funciona, como las bibliotecas y el mono.
Por último, descarga el código fuente del texto:
Turistas, si queréis ver el contenido oculto de esta publicación, por favor Respuesta
|