Unabhängigkeit vom Framework

    • Allgemein

    Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von slice.

      Unabhängigkeit vom Framework

      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 :D
      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

      Quellcode

      1. $ nano ~/.bashrc
      nutzen.
      Am Ende der Datei einfach folgende Codezeilen einfügen:

      Quellcode

      1. MONO=/cygdrive/c/progra~2/Mono-2.11.4
      2. export PATH=$PATH:$MONO/bin
      3. export PKG_CONFIG_PATH=$MONO/lib/pkgconfig
      4. export CC="i686-pc-mingw32-gcc -U _WIN32"

      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:

      Quellcode

      1. export CC="gcc -U _WIN32"

      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

      1. temp.c: In function `main':
      2. temp.c:149: Warnung: implizite Deklaration der Funktion »g_utf16_to_utf8«
      3. temp.c:149: Warnung: Zuweisung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
      4. temp.c:164: Warnung: Zuweisung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
      5. /cygdrive/c/Users/ALIVED~1/AppData/Local/Temp/ccGUCk9S.o: In function `main':
      6. /cygdrive/d/.../bin/Release/temp.c:149: undefined reference to `_g_utf16_to_utf8'
      7. /cygdrive/d/.../bin/Release/temp.c:164: undefined reference to `_g_utf16_to_utf8'
      8. collect2: ld gab 1 als Ende-Status zurück
      9. [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 :D
      Dafür wird der "mkbundle"-Befehl verwendet. Eine kurze Übersicht der Parameter:

      Quellcode

      1. Usage is: mkbundle [options] assembly1 [assembly2...]
      2. Options:
      3. -c Produce stub only, do not compile
      4. -o out Specifies output filename
      5. -oo obj Specifies output filename for helper object file
      6. -L path Adds `path' to the search path for assemblies
      7. --nodeps Turns off automatic dependency embedding (default)
      8. --deps Turns on automatic dependency embedding
      9. --keeptemp Keeps the temporary files
      10. --config F Bundle system config file `F'
      11. --config-dir D Set MONO_CFG_DIR to `D'
      12. --machine-config F Use the given file as the machine.config for the application.
      13. --static Statically link to mono libs
      14. --nomain Don't include a main() function, for libraries
      15. -z Compress the assemblies before embedding.
      16. 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:

      Quellcode

      1. $ mkbundle -o Mono/WarmRechner.exe WarmRechner.exe --deps -z

      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:


      Dinge die nicht funktionieren

      Quellcode

      1. - Sql Ce
      2. - WPF

      Hab ich was vergessen? Sag mir was nicht geht und ich füge es hinzu


      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 :D
      Bilder
      • Explorer.png

        14,79 kB, 661×281, 526 mal angesehen

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „AliveDevil“ ()

      Also es ist "relativ" groß (im vgl. zu der .NET Anwendung).
      .NET ~8 KB, die unabhängige Anwendung ~19 MB.
      Kommt auch immer drauf an, welche Anwendungen/Bibliotheken du brauchst. Wenn du das mit "-z" erzeugst, kann die unabhängige Anwendung schon auf ~25% schrumpfen (~5 MB). Geht aber zu lasten der Startperformance.

      Es wird nur das einkompiliert, was du brauchst.
      Sorry das ich dieses alte Thema wieder ausgrabe aber ich will es unbedingt wissen.
      Ich hab Mono und Cygwin installiert.
      Starte ich nun das Terminal von Cygwin und gebe

      Quellcode

      1. nano ~/.bashrc
      ein.
      Kriege ich den error Kommand nicht gefunden? :o
      C# Developer
      Learning C++
      Hi,

      ich habe es nach deiner Anleitung probiert, jedoch bekomme ich folgenden Fehler: (Siehe Anhang)

      Wo liegt der Fehler? :/
      Bilder
      • Unbenannt123.PNG

        33,33 kB, 590×300, 221 mal angesehen
      Das ist seltsam, den ich habe mingw auf der C-Platte...

      hmm, wo könnte es sonst liegen? :(
      Bilder
      • Unbenannt4.PNG

        97,1 kB, 679×415, 177 mal angesehen
      noch immer ein Error, er sucht die ganze Zeit nach einem dos2unix-befehl der nicht exestiert...
      Ich habs mal bei ner simplen MsgBox app versucht, alles was notwendig war installiert, er fängt auch an die Dependencies-Dlls reinzupacken, doch dann, passiert plötzlich das:



      Was ist da los?
      Was fehlt, was hab ich nicht installiert?
      C# Developer
      Learning C++
      Schau mal hier nach: stackoverflow.com/questions/91…ing-mingw/9131263#9131263
      Wobei der Fehler angeblich behoben sein soll (bugs.python.org/issue12641) - update mal deine Umgebung (cygwin etc.) ansonsten versuchs mit der Lösung aus dem Link oben.