Pregunta

Estoy tratando de usar MKBundle para poder distribuir una aplicación GTK# sin que los usuarios necesiten instalar .net/mono o gtk#. He agrupado con éxito una aplicación que usa WinForms, pero por alguna razón, cuando hago lo mismo con una aplicación GTK#, no funcionará.

Esto es lo que obtengo de Cygwin:

$ mkbundle --deps a.exe OS is: Windows Sources: 1 Auto-dependencies: True

Excepción no controlada: System.io.FilenotFoundException: no se pudo cargar el archivo o el ensamblaje 'GTK-Sharp' o una de sus dependencias. El sistema no puede encontrar el archivo especificado.
Nombre del archivo: 'GTK-Sharp'
en System.Appdomain.Load (System.Reflection.AssemblyName AssemblyRef, System.Security.Policy.Evidence AssemblySecurity) [0x00000] en: 0
AT (WRAPPER RETOTING-INVOKE-With-Check) System.appdomain: Load (System.Reflection.AssemblyName, System.Security.Policy.Evidence)
en System.Appdomain.Load (System.Reflection.AssemblyName AssemblyRef) [0x00000] en: 0
AT (WRAPPER RETOTING-INVOKE-With-Check) System.appdomain: Load (System.Reflection.AssemblyName)
en System.Reflamection.Assembly.Load (System.Reflection.AssemblyName AssemblyRef) [0x00000] en: 0
en MakeBundle.Queueassembly (system.collections.ArrayList Files, System.String CodeBase) [0x00000] en: 0
en MakeBundle.Main (System.String [] args) [0x00000] en: 0
Error] Excepción fatal no controlada: system.io.filenotfoundException: no pudo cargar el archivo o el ensamblaje 'GTK-Sharp' o una de sus dependencias. El sistema no puede encontrar el archivo especificado.
Nombre del archivo: 'GTK-Sharp'
en System.Appdomain.Load (System.Reflection.AssemblyName AssemblyRef, System.Security.Policy.Evidence AssemblySecurity) [0x00000] en: 0
AT (WRAPPER RETOTING-INVOKE-With-Check) System.appdomain: Load (System.Reflection.AssemblyName, System.Security.Policy.Evidence)
en System.Appdomain.Load (System.Reflection.AssemblyName AssemblyRef) [0x00000] en: 0
AT (WRAPPER RETOTING-INVOKE-With-Check) System.appdomain: Load (System.Reflection.AssemblyName)
en System.Reflamection.Assembly.Load (System.Reflection.AssemblyName AssemblyRef) [0x00000] en: 0
en MakeBundle.Queueassembly (system.collections.ArrayList Files, System.String CodeBase) [0x00000] en: 0
en MakeBundle.Main (System.String [] args) [0x00000] en: 0`

Pero aún tengo/cygdrive/c/gtksharp/2.12/lib en mi variable de ruta. Puedo verificar esto, como si escribiera "gtk-sharp.dll" en cygwin, obtengo lo siguiente:

$ gtk-sharp.dll bash: /cygdrive/c/GtkSharp/2.12/lib/gtk-sharp-2.0/gtk-sharp.dll: cannot execute binary file

¡Entonces debería poder encontrar el archivo!

Cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

Encontré un script de shell que hace todo esto y lo modificó a las últimas versiones, a partir de mayo de 2013, puede usar el script de la siguiente manera:

https://gist.github.com/tebjan/5581296

1.) Instale cygwin y asegúrese de seleccionar los siguientes paquetes:-GCC-Mingw-PKG-Config-Mingw-Zlib1-Mingw-Zlib-Devel

2.) Instale el paquete de lanzamiento mono: "Mono para Windows, GTK#y XSP"

3.) Descargue el lugar de script además de su aplicación y modifíquela para que se ajuste a su entorno (lea los comentarios en el archivo cuidadosamente).

4.) Abra cygwin y navegue a la carpeta de salida de su aplicación donde se encuentra el ececutable y el scipt, por ejemplo, su proyecto/bin/liberación

5.) Ejecute el script con el comando: ./mkbundle_cygwin.sh

Solución de problemas: si su ejecutable agrupado no funciona, asegúrese de que la aplicación .NET original funcione en Mono. Puede probarlo llamando a mono.exe y pasar su aplicación .NET o instalando XamarinStudio y ejecutando su proyecto desde allí (haga que establezca mono como tiempo de ejecución).

Otros consejos

Ok, no sé si esta es una solución real, pero acabo de copiar los conjuntos de c: gtksharp 2.12 lib gtk-sharp-2.0 a c: mono-2.10.5 lib mono 4.0 y y Ahora parece agrupar bien usando los siguientes pasos:

mkbundle -c -o host.c -oo bundle.o --deps app.exe

nano host.c

Cambie lo siguiente de:

#ifdef _WIN32
#include <windows.h>
#endif`

a

#ifdef _WIN32
#include <windows.h>
#endif
#undef _WIN32

Y finalmente:

gcc -mno-cygwin -o bundled.exe -Wall host.c `pkg-config --cflags --libs mono-2|dos2unix` bundle.o

Eso funcionó para mí. Aunque también he necesitado algunas cosas para copiar la máquina.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top