Du bist es leid, anderen zu sagen, dass sie das .NET Framework aktualisieren sollen?
Es funktioniert nicht so, wie geplant auf anderen System, weil spezielle Komponenten fehlen?
Du möchtest, dass deine Anwendung auch auf Linux System läuft und dabei nicht auf die Funktionen des .NET Framework 4.5 verzichten?
Nun, es gibt eine Möglichkeit, dies zu tun. Ja, wirklich. Nur musst du dafür einiges in Kauf nehmen, was nicht mehr funktionieren
oder Fehler produzieren wird.
Dieser Vorgang erfordert einige Installationen und Veränderungen an deinem System und deinem Projekt.
Kurz aufgelistet die Voraussetzungen:
Mono einfach installieren - man kann nichts falsch machen
Für cygwin müssen beim Setup die oben genannten Pakete installiert werden ("as" kann u.U. nicht gefunden werden, ist dann aber egal).
Ein praktisches Tool für cygwin wäre "nano", ein Editor für Linux-Systeme auf Kommandozeilenbasis.
Nun erstmal cygwin starten und man sieht folgendes Bild:
Der Nutzername (vor dem @) und der Rechnername (nach dem @) können sich unterscheiden.
Was wir nun machen müssen, ist erstmal ein bisschen in den Pfadreferenzen zu spielen.
Dazu einfach nutzen.
Am Ende der Datei einfach folgende Codezeilen einfügen:
cygdrive ist eine 1:1 Abbildung aller deiner Festplatten. Dadurch ist /c/ hier die Systemfestplatte.
Bitte beachte, dass progra~2 für ein 64 Bit System gilt (Program Files (x86)), für 32 Bit einfach program~1 eintragen.
Ich nehme an, dass die letzte Zeile für 32 Bit Systeme so geändert werden muss:
Bitte berichten, ob es auf 32 Bit System damit funtioniert. Gegebenenfalls auch einfach mal rauslassen.
Unter 64 Bit System ist die letzte Zeile aber unendlich wichtig, da der Compiler den generierten Code sonst nicht kompiliert, sondern mit folgender Meldung abbricht:
Den Editor nun mit STRG+X beenden, die Meldung, die Dateien zu speichern mit einem "y" bestätigen und cygwin neustarten.
Nun kommt der lustig und frustrierende Teil des Ganzen.
Wenn alles korrekt installiert und konfiguriert wurde, müssen die Dateien nurnoch zusammengeschmissen werden, richtig?
Das bedeutet aber auch, dass du die Lizenz der Bibliotheken beachten musst, die du einbettest. Wenn der Autor schreibt, dass du die Bibliothek nicht einbetten darfst,
kannst du jetzt aufhören zulesen, da es verboten ist.
Außerdem gibt es noch Klauseln in Lizenzbedingungen die das statische Linken (was das hier im Grunde ist) nur mit gleicher Lizenz erlauben - du also die Lizenz der Bibliothek nutzen musst.
Nun denn, soviel zum Rechtlichen - obwohl ich mich da nicht gut auskenne, sollte das obrige klar sein.
Dieser Vorgang ist für alle .NET basierenden Sprachen gleich - C#, VB.NET, VC++, F#.
Zuerst in den Projekt-Ordner navigieren (ich nehme Beispielsweise "WarmRechner")
Im Ordner angekommen, solltest du einen Ordner erstellen, der nur mit der Standalone verteilt wird. Z.B. "Mono".
Was fehlt? Korrekt, die Anwendung
Dafür wird der "mkbundle"-Befehl verwendet. Eine kurze Übersicht der Parameter:
Hierbei ist zu beachten, dass "--static" nicht auf Windows funktioniert und "--nomain" Fehler produziert.
Jetzt nurnoch den Befehl zusammenschreiben.
Bei mir Beispielsweise:
Da ich keine Abhängigkeiten zu anderen Bibliotheken habe, funktioniert das auch bestens.
Solltest du noch weitere Bibliotheken brauchen, musst du diese vor --deps reinschreiben.
-z komprimiert das Zeug - sehr praktisch.
Am Ende sollte dann etwas ähnliches zu finden sein:
Analog dazu, die Kompilierung eines VB-Konsolenprojektes:
Jetzt nurnoch die Datei "mono-2.0.dll" aus dem bin-Verzeichnis im Mono-Installationsordner in den Mono-Projekt-Ordner kopieren und die Anwendung läuft auf allen Systemen.
Solltest du den Parameter -z genutzt haben, musst du noch die zlib1.dll aus selbigem Ordner in den Mono-Projekt-Ordner kopieren.
Am Ende sollte das dann so aussehen:
Die ganze Prozedur benötigt einiges an testen, rumspielen und Rechner-in-die-Ecke-werfen - aber dafür läuft die Anwendung am Ende auf allen Systemen.
Ich hoffe, ich habe nichts vergessen. Sollten Fehler auftreten, bitte melden.
Verbesserungsvorschläge? Einfach eine Antwort hierdrauf erstellen, ich freue mich über alles
Es funktioniert nicht so, wie geplant auf anderen System, weil spezielle Komponenten fehlen?
Du möchtest, dass deine Anwendung auch auf Linux System läuft und dabei nicht auf die Funktionen des .NET Framework 4.5 verzichten?
Nun, es gibt eine Möglichkeit, dies zu tun. Ja, wirklich. Nur musst du dafür einiges in Kauf nehmen, was nicht mehr funktionieren
oder Fehler produzieren wird.
Dieser Vorgang erfordert einige Installationen und Veränderungen an deinem System und deinem Projekt.
Kurz aufgelistet die Voraussetzungen:
- Mono 2.11.4 !Mono 3 funktioniert nicht
- Cygwin mit gcc, gcc-core, "as"
Mono einfach installieren - man kann nichts falsch machen
Für cygwin müssen beim Setup die oben genannten Pakete installiert werden ("as" kann u.U. nicht gefunden werden, ist dann aber egal).
Ein praktisches Tool für cygwin wäre "nano", ein Editor für Linux-Systeme auf Kommandozeilenbasis.
Nun erstmal cygwin starten und man sieht folgendes Bild:
Der Nutzername (vor dem @) und der Rechnername (nach dem @) können sich unterscheiden.
Was wir nun machen müssen, ist erstmal ein bisschen in den Pfadreferenzen zu spielen.
Dazu einfach nutzen.
Am Ende der Datei einfach folgende Codezeilen einfügen:
cygdrive ist eine 1:1 Abbildung aller deiner Festplatten. Dadurch ist /c/ hier die Systemfestplatte.
Bitte beachte, dass progra~2 für ein 64 Bit System gilt (Program Files (x86)), für 32 Bit einfach program~1 eintragen.
Ich nehme an, dass die letzte Zeile für 32 Bit Systeme so geändert werden muss:
Bitte berichten, ob es auf 32 Bit System damit funtioniert. Gegebenenfalls auch einfach mal rauslassen.
Unter 64 Bit System ist die letzte Zeile aber unendlich wichtig, da der Compiler den generierten Code sonst nicht kompiliert, sondern mit folgender Meldung abbricht:
Quellcode
- temp.c: In function `main':
- temp.c:149: Warnung: implizite Deklaration der Funktion »g_utf16_to_utf8«
- temp.c:149: Warnung: Zuweisung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
- temp.c:164: Warnung: Zuweisung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
- /cygdrive/c/Users/ALIVED~1/AppData/Local/Temp/ccGUCk9S.o: In function `main':
- /cygdrive/d/.../bin/Release/temp.c:149: undefined reference to `_g_utf16_to_utf8'
- /cygdrive/d/.../bin/Release/temp.c:164: undefined reference to `_g_utf16_to_utf8'
- collect2: ld gab 1 als Ende-Status zurück
- [Fail]
Den Editor nun mit STRG+X beenden, die Meldung, die Dateien zu speichern mit einem "y" bestätigen und cygwin neustarten.
Nun kommt der lustig und frustrierende Teil des Ganzen.
Wenn alles korrekt installiert und konfiguriert wurde, müssen die Dateien nurnoch zusammengeschmissen werden, richtig?
Das bedeutet aber auch, dass du die Lizenz der Bibliotheken beachten musst, die du einbettest. Wenn der Autor schreibt, dass du die Bibliothek nicht einbetten darfst,
kannst du jetzt aufhören zulesen, da es verboten ist.
Außerdem gibt es noch Klauseln in Lizenzbedingungen die das statische Linken (was das hier im Grunde ist) nur mit gleicher Lizenz erlauben - du also die Lizenz der Bibliothek nutzen musst.
Nun denn, soviel zum Rechtlichen - obwohl ich mich da nicht gut auskenne, sollte das obrige klar sein.
Dieser Vorgang ist für alle .NET basierenden Sprachen gleich - C#, VB.NET, VC++, F#.
Zuerst in den Projekt-Ordner navigieren (ich nehme Beispielsweise "WarmRechner")
Im Ordner angekommen, solltest du einen Ordner erstellen, der nur mit der Standalone verteilt wird. Z.B. "Mono".
Was fehlt? Korrekt, die Anwendung
Dafür wird der "mkbundle"-Befehl verwendet. Eine kurze Übersicht der Parameter:
Quellcode
- Usage is: mkbundle [options] assembly1 [assembly2...]
- Options:
- -c Produce stub only, do not compile
- -o out Specifies output filename
- -oo obj Specifies output filename for helper object file
- -L path Adds `path' to the search path for assemblies
- --nodeps Turns off automatic dependency embedding (default)
- --deps Turns on automatic dependency embedding
- --keeptemp Keeps the temporary files
- --config F Bundle system config file `F'
- --config-dir D Set MONO_CFG_DIR to `D'
- --machine-config F Use the given file as the machine.config for the application.
- --static Statically link to mono libs
- --nomain Don't include a main() function, for libraries
- -z Compress the assemblies before embedding.
- You need zlib development headers and libraries.
Hierbei ist zu beachten, dass "--static" nicht auf Windows funktioniert und "--nomain" Fehler produziert.
Jetzt nurnoch den Befehl zusammenschreiben.
Bei mir Beispielsweise:
Da ich keine Abhängigkeiten zu anderen Bibliotheken habe, funktioniert das auch bestens.
Solltest du noch weitere Bibliotheken brauchen, musst du diese vor --deps reinschreiben.
-z komprimiert das Zeug - sehr praktisch.
Am Ende sollte dann etwas ähnliches zu finden sein:
Analog dazu, die Kompilierung eines VB-Konsolenprojektes:
Jetzt nurnoch die Datei "mono-2.0.dll" aus dem bin-Verzeichnis im Mono-Installationsordner in den Mono-Projekt-Ordner kopieren und die Anwendung läuft auf allen Systemen.
Solltest du den Parameter -z genutzt haben, musst du noch die zlib1.dll aus selbigem Ordner in den Mono-Projekt-Ordner kopieren.
Am Ende sollte das dann so aussehen:
Die ganze Prozedur benötigt einiges an testen, rumspielen und Rechner-in-die-Ecke-werfen - aber dafür läuft die Anwendung am Ende auf allen Systemen.
Ich hoffe, ich habe nichts vergessen. Sollten Fehler auftreten, bitte melden.
Verbesserungsvorschläge? Einfach eine Antwort hierdrauf erstellen, ich freue mich über alles
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „AliveDevil“ ()