Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 219600|Respuesta: 43

[WinForm] .net/c# Usa Costura.Fody para empaquetar la DLL en el EXE

[Copiar enlace]
Publicado en 14/4/2018 14:41:49 | | | |
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)

C# empaqueta la dll en el programa del ejecutivo
http://www.itsvse.com/thread-2841-1-1.html
(Fuente: Architect_Programmer)



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 favorRespuesta





Anterior:Solución StreamReader para caracteres distorsionados al leer archivos
Próximo:Soluciones para conflictos entre Hyper-V, VirtualBox y VMware
Publicado en 7/6/2018 9:35:19 |
¡Prueba este método para integrar el componente de dependencia Dll en un EXE compilado en C#!

Si es fácil de usar, ¡recuerda elogiarlo! Jaja, esto, solo añade Dll al archivo de recursos, ¡sencillo y práctico! (No lo entiendo, puedo hacer un tutorial) @小渣渣

 Propietario| Publicado en 6/6/2018 10:30:42 |
Si firmas un programa, recibirás el siguiente error:

1>MSBUILD : error : Fody: Ocurrió una excepción no gestionada:
1>MSBUILD : error : Excepción:
1>MSBUILD: error: No se puede obtener una clave pública para StrongNameKeyPair.
1>MSBUILD : error : StackTrace:
1>MSBUILD: error: en System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: error: en System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: error: en Mono.Cecil.ModuleWriter.WriteModuleTo(módulo DefinitionMódulo, flujo Disposable'1, parámetros WriterParters)
1>MSBUILD: error: en Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parameters)
1>MSBUILD: error: En InnerWeaver.WriteModule() posición C:\projects\fody\FodyIsolated\ModuleWriter.cs: línea número 18
1>MSBUILD: error: En InnerWeaver.Execute() posición C:\projects\fody\FodyIsolated\InnerWeaver.cs: número de línea 86
1>MSBUILD : error : Fuente:
1>MSBUILD : error : mscorlib
1>MSBUILD : error : TargetSite:
1>MSBUILD : error : Byte[] ComputePublicKey()
1>MSBUILD : error :
1> Fody: Terminé el Fody 551ms.


Parece que no hay solución, consulta el artículo:

https://github.com/Fody/ExtraConstraints/issues/5

https://github.com/Fody/Costura/issues/194


No confíes en nombres fuertes para mantenerte seguro.

Así que parece inútil ir más allá para proteger algo que no es una característica de seguridad

 Propietario| Publicado en 17/4/2018 13:02:12 |
xxhh Publicado el 17-4-2018 a las 11:35
Después de instalar Costura.Fody directamente en lugar de NuGet, arrastré un reproductor de Windows Media Playe para generar dos DLLs integradas para eliminar o reportar ...

Los controles de Windows Media Player son componentes de comunicación, no sé si "Costura.Fody" los soporta.

1: Deberías comprobar si "Costura.Fody" soporta "com components"
2: Ignora las dos DLL que están empaquetadas; para cómo ignorar el xml debe configurarse, consulta la documentación oficial para más detalles
Publicado en 17/4/2018 10:29:52 |
Descargue para ver la configuración XML
Publicado en 17/4/2018 10:33:34 |
El propietario quiere preguntarte si puedo descargar el vídeo y montarlo en un plugin exe
 Propietario| Publicado en 17/4/2018 11:16:15 |
xxhh Publicado el 17-4-2018 a las 10:33
El propietario quiere preguntarte si puedo descargar el vídeo y montarlo en un plugin exe
...

Puedes hacerlo, puedes poner la propiedad de vídeo en "Recursos incrustados" y luego leer el archivo de recursos.
Publicado en 17/4/2018 11:35:51 |
Xiao Zhao publicó el 17-4-2018 a las 11:16
Puedes hacerlo, puedes poner la propiedad de vídeo en "Recursos incrustados" y luego leer el archivo de recursos. ...

Arrastré un reproductor de Windows Media Playe justo después de instalar Costura.Fody en vs NuGet y generé dos DLLs integradas para eliminar o reportar un error  
Publicado en 17/4/2018 11:57:09 |
¿Todavía es necesario configurar XML?     
Publicado en 17/4/2018 17:42:31 |
Xiao Zhao publicó el 17-4-2018 a las 11:16
Puedes hacerlo, puedes poner la propiedad de vídeo en "Recursos incrustados" y luego leer el archivo de recursos. ...

Quiero preguntar si el casero o yo, pongo el vídeo en el recurso incrustado, lo que se lee es un array de bytes, ¿hay alguna forma de ponerlo en el reproductor y reproducirlo directamente? (No quiero escribir en el local para reproducir en la ruta de lectura, el vídeo es más que la tarjeta grande).
 Propietario| Publicado en 17/4/2018 20:52:16 |
xxhh Publicado el 17-4-2018 17:42
Quiero preguntar si el casero o yo, pongo el vídeo en el recurso incrustado, y lo que se lee es un array de bytes, ¿hay alguna forma de ponerlo en el reproductor y reproducirlo directamente ( ...

No se recomienda convertir un vídeo grande en un archivo de recurso, puedes ver si hay alguna otra forma para que el reproductor pase directamente en byte[]
Publicado en 18/4/2018 8:08:48 |
Xiao Zhazha Publicado el 17-4-2018 20:52
No se recomienda convertir un vídeo grande en un archivo de recurso, puedes ver si hay alguna otra forma para que el reproductor pase directamente en byte[] ...

Ninguno de ellos lee direcciones en vídeo y quiere preguntarte qué buenas ideas tienes
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com