Frage

Ich versuche, MKBundle zu verwenden, damit ich eine GTK# -Anwendung verteilen kann, ohne dass Benutzer .NET/Mono oder GTK# installieren müssen. Ich habe eine Anwendung erfolgreich gebündelt, die WinForms verwendet, aber aus irgendeinem Grund funktioniert ich mit einer GTK# -Anwendung, die nicht funktioniert.

Das bekomme ich aus Cygwin:

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

Unbeschriebene Ausnahme: System.io.FilenotFoundException: Es konnte keine Datei oder Assemblierung 'GTK-sharp' oder eine seiner Abhängigkeiten geladen werden. Die angegebene Datei wurde vom System nicht gefunden.
Dateiname: 'gtk-sharp'
at system.appdomain.load (System.reflection.AssemblyName AssemblyRef, System.security.policy.Evidence Assemblysecurity) [0x00000] in: 0
AT (Wrapper Remoting-Invoke-with-Check) System.Appdomain: Load (System.reflection.AssemblyName, System.security.policy.Evidence)
at system.appdomain.load (System.reflection.AssemblyName AssemblyRef) [0x00000] in: 0
AT (Wrapper remoting-Invoke-with-Check) System.Appdomain: Load (System.reflection.AssemblyName)
at system.reflection.assembly.load (System.reflection.AssemblyName AssemblyRef) [0x00000] in: 0
bei makeBundle.queueassembly (System.Collections.ArrayList -Dateien, System.String Codebase) [0x00000] in: 0
bei Makebundle.main (System.String [] args) [0x00000] in: 0
Fehler] Fatale ungehandelte Ausnahme: System.io.FilenotFoundException: konnte keine Datei oder Assemblierung 'GTK-sharp' oder eine seiner Abhängigkeiten laden. Die angegebene Datei wurde vom System nicht gefunden.
Dateiname: 'gtk-sharp'
at system.appdomain.load (System.reflection.AssemblyName AssemblyRef, System.security.policy.Evidence Assemblysecurity) [0x00000] in: 0
AT (Wrapper Remoting-Invoke-with-Check) System.Appdomain: Load (System.reflection.AssemblyName, System.security.policy.Evidence)
at system.appdomain.load (System.reflection.AssemblyName AssemblyRef) [0x00000] in: 0
AT (Wrapper remoting-Invoke-with-Check) System.Appdomain: Load (System.reflection.AssemblyName)
at system.reflection.assembly.load (System.reflection.AssemblyName AssemblyRef) [0x00000] in: 0
bei makeBundle.queueassembly (System.Collections.ArrayList -Dateien, System.String Codebase) [0x00000] in: 0
bei Makebundle.main (System.String [] args) [0x00000] in: 0`

Doch ich habe /cygdrive/c/gtksharp/2.12/lib in meiner Pfadvariable. Ich kann dies überprüfen, als würde ich "gtk-sharp.dll" in Cygwin eingeben. Ich bekomme die folgende zurückgegeben:

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

Es sollte also in der Lage sein, die Datei zu finden!

Jede Hilfe wäre sehr geschätzt.

War es hilfreich?

Lösung

Ich habe ein Shell -Skript gefunden, das all dies ausmacht und es an die neuesten Versionen geändert hat. Ab Mai 2013 können Sie das Skript nur wie folgt verwenden:

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

1.) Installieren Sie Cygwin und stellen Sie sicher

2.) Installieren Sie das Mono -Release -Paket: "Mono für Windows, GTK#und XSP"

3.) Laden Sie das Skript -Platz neben Ihrer Anwendung herunter und ändern Sie es so, dass Sie Ihre Umgebung entsprechen (lesen Sie die Kommentare in der Datei sorgfältig).

4.) Öffnen Sie Cygwin und navigieren Sie zum Ausgangsordner Ihrer Anwendung, in dem die öfträglichen und die Skiptliege, z.

5.) Führen Sie das Skript mit dem Befehl aus: ./mkbundle_cygwin.sh

Fehlerbehebung: Wenn Ihre gebündelte ausführbare Datei nicht funktioniert, stellen Sie sicher, dass die ursprüngliche .NET -Anwendung auf Mono funktioniert. Sie können das testen, indem Sie Mono.exe anrufen und Ihre .NET -App an sie übergeben oder Xamarinstudio installieren und Ihr Projekt von dort aus ausführen (lassen Sie Sie Mono als Laufzeit festlegen).

Andere Tipps

Ok, ich weiß nicht, ob dies eine echte Lösung ist, aber ich habe die Baugruppen von C: gtksharp 2.12 lib gtk-sharp-2.0 bis c: mono-2.10.5 lib mono 4.0 und kopiert Jetzt scheint es OK mit den folgenden Schritten zu bündeln:

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

nano host.c

Ändern Sie Folgendes aus:

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

zu

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

Und schlussendlich:

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

Das hat für mich funktioniert. Obwohl ich auch für einige Dinge machine.config von C: mono-2.10.5 etc mono 4.0 in das Verzeichnis kopieren musste, in dem sich meine Anwendung befindet, und-machine-config machine.config zu mkbundle.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top