c# - Cómo hacer que la opción "mkbundle--deps" funcione con mono 3.2.3
(1)
Estoy intentando agrupar la aplicación con mono 3.2.3 en un ejecutable independiente. Para ello, estoy siguiendo this pauta. Después de declarar variables:
mono_version="3.2.3"
export MONO=/cygdrive/c/progra~2/Mono-$mono_version
machineconfig=$PROGRAMFILES//Mono-$mono_version//etc//mono//4.5//machine.config
export PATH=$PATH:$MONO/bin
export PKG_CONFIG_PATH=$MONO/lib/pkgconfig
export CC="i686-pc-mingw32-gcc -U _WIN32"
El comando mkbundle --deps no puede localizar los ensamblados referenciados:
Unhandled Exception:
System.IO.FileNotFoundException: Could not load file or assembly ''gtk-sharp'' or
one of its dependencies. The system cannot find the file specified.
File name: ''gtk-sharp''
Realizando exactamente la misma operación con mono 2.10.9:
mono_version="2.10.9"
export MONO=/cygdrive/c/progra~2/Mono-$mono_version
machineconfig=$PROGRAMFILES//Mono-$mono_version//etc//mono//4.0//machine.config
export PATH=$PATH:$MONO/bin
export PKG_CONFIG_PATH=$MONO/lib/pkgconfig
export CC="i686-pc-mingw32-gcc -U _WIN32"
mkbundle --deps --machine-config "$machineconfig" -c UI.exe
da resultado positivo:
OS is: Windows
WARNING:
Check that the machine.config file you are bundling
doesn''t contain sensitive information specific to this machine.
Sources: 3 Auto-dependencies: True
embedding: C:/users/piotr/desktop/authoringtool/UI/bin/debug/UI.exe
config from: C:/users/piotr/desktop/authoringtool/UI/bin/debug/UI.exe.config
embedding: C:/PROGRA~2/MONO-2~1.9/lib/mono/gac/gtk-sharp/2.12.0.0__35e10195dab3c99f/gtk-sharp.dll
embedding: C:/PROGRA~2/MONO-2~1.9/lib/mono/gac/glib-sharp/2.12.0.0__35e10195dab3c99f/glib-sharp.dll
.
.
.
embedding: C:/PROGRA~2/MONO-2~1.9/lib/mono/4.0/Mono.Posix.dll
Machine config from: C:/Program Files (x86)/Mono-2.10.9/etc/mono/4.0/machine.config
Compiling:
as -o temp.o temp.s
¿Alguien sabe la razón de tal comportamiento? Estoy usando la versión de 64 bits de Windows 7 y el Cygwin que encontré en el sitio web oficial. El código fue compilado y probado en Xamarin Studio 4.2 y Visual Studio 2010.
Howto para mkbundle en cygwin + mingw
Probado con mono 4.0.3
En mono 4.0.3, mkbundle funciona, pero puede ser complicado hacer que funcione.
Primero, revisa tu configuración:
- Instale Mono / GTK # en una ruta que no contenga espacios (es decir, no en los Archivos de programa)
- Configure una cadena de compilación de trabajo MinGw / Cygwin (como la que se usa para compilar mono en windows ).
- Defina las variables de entorno obligatorias para mkbundle:
- La ubicación del compilador mingw debe estar en la RUTA DE Windows (usada por cmd)
- pkg-config también debería estar en el PATH de Windows
- Use el siguiente script de cygwin (se puede adaptar para ejecutarse en cmd)
# M_PREFIX refers to Mono installation # For more information, search for prefix installation in Mono documentation M_PREFIX=''/cygdrive/c/Mono'' export DYLD_FALLBACK_LIBRARY_PATH=${M_PREFIX}/lib:${DYLD_FALLBACK_LIBRARY_PATH} export LD_LIBRARY_PATH=${M_PREFIX}/lib:${M_PREFIX}/lib/mono/4.5:${LD_LIBRARY_PATH} export C_INCLUDE_PATH=${M_PREFIX}/include:${C_INCLUDE_PATH} export ACLOCAL_PATH=${M_PREFIX}/share/aclocal:${ACLOCAL_PATH} export PKG_CONFIG_PATH=${M_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH} # Here we added the system32 to make cmd available to mkbundle # /usr/bin is the default location for mingw export PATH=${M_PREFIX}/bin:/cygdrive/c/Windows/system32:/usr/bin:${PATH} export CC="i686-pc-mingw32-gcc -U _WIN32"
Entonces puedes correr:
mkbundle --deps --keeptemp my.exe my.dll -o bundled.exe
Notas: - Copie mono-2.0.dll
en el directorio de la aplicación, ya que debe distribuirse a lo largo del mono-2.0.dll
cp ${M_PREFIX}/bin/mono-2.0.dll .
- Si se usa
-z
, también se debe copiar zlib1.dll. (tenga en cuenta que la invocación gcc también cambia). Es posible que necesite más dll dependiendo de su uso de las características del marco (no lista exhaustiva: libglib * .dll, libgmodule * .dll, libgthread * .dll, iconv.dll, intl.dll) -
-c
se utiliza para generar solo stub. - Debe especificar todos los archivos exe y dll que se necesitan para el paquete.
-
--keeptemp
mantendrá temp.c y temp.s, lo que podría ser útil si mkbundle falla en la invocación de gcc. - Si desea invocar gcc a mano (y puede ser necesario):
i686-pc-mingw32-gcc -U _WIN32 -g -o output.exe -Wall temp.c $(pkg-config --cflags --libs mono-2) temp.o
Para aplicaciones de consola
Para hacer que la aplicación de la consola funcione, debe eliminar -mwindows del comando gcc. Para hacer eso, debes invocar pkg-config --cflags --libs mono-2
y eliminar los -mwindows
.
Deberías obtener algo así después:
i686-pc-mingw32-gcc -g -o output.exe -Wall temp.c -mms-bitfields -IC:/Mono/include/mono-2.0 -mms-bitfields -LC:/Mono/lib -lmono-2.0 -lws2_32 -lpsapi -lole32 -lwinmm -loleaut32 -l advapi32 -lversion temp.s
Cualquiera puede mejorar mkbundle
mkbundle es una aplicación de consola C # de código abierto ( en mono github ) por lo que puede modificarse y recompilarse fácilmente según sus necesidades. Leer el código también podría ser útil para entender cómo funciona debajo.
El uso de cmd como los diferentes comandos utilizados por mkbundle están codificados para que se beneficie de alguna mejora en la parametrización.