mkbundle e GTK #
Domanda
Sto cercando di utilizzare mkbundle in modo che possa distribuire un GTK # applicazione senza che gli utenti che hanno bisogno di installare .NET / Mono o GTK #. Ho in bundle con successo un'applicazione che utilizza WinForms, ma per qualche ragione quando faccio lo stesso con un GTK # applicazione non funzionerà.
Questo è quello che mi alzo dal Cygwin:
$ mkbundle --deps a.exe
OS is: Windows
Sources: 1 Auto-dependencies: True
Eccezione non gestita: System.IO.FileNotFoundException: Impossibile caricare il file o l'assembly 'gtk-sharp' o una delle sue dipendenze. Il sistema non riesce a trovare il file specificato.
Nome file: 'gtk-sharp'
a System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity) [0x00000] in: 0
a (involucro servizi remoti-invoke-con-check) System.AppDomain: Carico (System.Reflection.AssemblyName, System.Security.Policy.Evidence)
a System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] in: 0
a (involucro servizi remoti-invoke-con-check) System.AppDomain: Carico (System.Reflection.AssemblyName)
a System.Reflection.Assembly.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] in: 0
a MakeBundle.QueueAssembly (file System.Collections.ArrayList, System.String codebase) [0x00000] in: 0
a MakeBundle.Main (System.String [] args) [0x00000] in: 0
[ERRORE] FATAL un'eccezione non gestita: System.IO.FileNotFoundException: Impossibile caricare il file o l'assembly 'gtk-sharp' o una delle sue dipendenze. Il sistema non riesce a trovare il file specificato.
Nome file: 'gtk-sharp'
a System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity) [0x00000] in: 0
a (involucro servizi remoti-invoke-con-check) System.AppDomain: Carico (System.Reflection.AssemblyName, System.Security.Policy.Evidence)
a System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] in: 0
a (involucro servizi remoti-invoke-con-check) System.AppDomain: Carico (System.Reflection.AssemblyName)
a System.Reflection.Assembly.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] in: 0
a MakeBundle.QueueAssembly (file System.Collections.ArrayList, System.String codebase) [0x00000] in: 0
a MakeBundle.Main (System.String [] args) [0x00000] in: 0 '
Ma ancora non ho /cygdrive/c/GtkSharp/2.12/lib nel mio variabile PATH. Posso controllare questo, come se digito "gtk-sharp.dll" in Cygwin ottengo il seguente restituita:
$ gtk-sharp.dll
bash: /cygdrive/c/GtkSharp/2.12/lib/gtk-sharp-2.0/gtk-sharp.dll: cannot execute binary file
Così dovrebbe essere in grado di trovare il file!
Qualsiasi aiuto sarebbe molto apprezzato.
Soluzione
Ho trovato uno script di shell che fa tutto questo e modificato per le ultime versioni, a partire da maggio 2013 si può semplicemente utilizzare lo script come segue:
https://gist.github.com/tebjan/5581296
.1) Installare Cygwin e assicurarsi di selezionare i seguenti pacchetti: - gcc-MinGW - pkg-config - mingw-zlib1 - mingw-zlib-devel
2) Installare il pacchetto di rilascio Mono:. "Mono per Windows, Gtk #, e XSP"
3.) Scarica il posto di script che oltre l'applicazione e modificarlo per adattare il vostro ambiente (leggere i commenti nel file con attenzione).
4.) Aprire Cygwin e passare alla cartella di output della vostra applicazione in cui l'ececutable e le bugie scipt, per esempio ProgettoUtente / bin / Release
5) Eseguire lo script con il comando:. ./Mkbundle_cygwin.sh
Risoluzione dei problemi: Se il file eseguibile in bundle non funziona assicurarsi che l'applicazione originale .NET funziona su mono. È possibile verificare che chiamando mono.exe e superare il tuo NET app per esso o installando XamarinStudio e l'esecuzione del progetto da lì (farà mono set come runtime).
Altri suggerimenti
OK Non so se questa è una vera soluzione, ma ho appena copiato le assemblee da C: \ GtkSharp \ 2.12 \ lib \ gtk-sharp-2.0 in C: \ Mono-2.10.5 \ lib \ mono \ 4.0 e ora sembra per impacchettare ok utilizzando le seguenti operazioni:
mkbundle -c -o host.c -oo bundle.o --deps app.exe
nano host.c
cambiare la seguente da:
#ifdef _WIN32
#include <windows.h>
#endif`
a
#ifdef _WIN32
#include <windows.h>
#endif
#undef _WIN32
E infine:
gcc -mno-cygwin -o bundled.exe -Wall host.c `pkg-config --cflags --libs mono-2|dos2unix` bundle.o
che ha lavorato per me. Anche se ho anche per alcune cose ho bisogno di copiare machine.config da C: \ Mono-2.10.5 \ etc \ mono \ 4.0 per la directory in cui la mia domanda è, e passare --machine-config machine.config a mkbundle <. / p>