Anwendung auf anderen Computern installieren
-
Ich habe mich ein wenig in VC++ .net eingewöhnt und eine erste kleine Applikation erstellt, ich verwende Visual Studio 2008 mit SP1. Zunächst habe ich naiverweise gedacht, es würde ausreichen, wenn auf dem Zielrechner für mein Programm .net framework 2.0 installiert wäre. Das ist aber leider nicht der Fall, vermutlich, da ich nicht nur managed code verwende. Ich habe herausbekommen, daß mein Programm zusätzlich die Microsoft.VC90.CRT benötigt, die auf den meisten Systemen nicht vorhanden ist.
Wird das Programm ohne diese benötigten dll gestartet kommt eine wenig hilfreiche und zudem auch noch mit einem Rechtschreibfehler versehene Meldung: "Diese Anwendung konnte nicht gestartet werden, weil die Anwenungskonfiguration nicht korrekt ist. Zur Problembehebung sollten sie die Anwendung neu installieren." Wenn man Google befragt, ist das ein häufiges Phänomen, das offenbar auch bei kommerziellen Programmen auftreten kann, von daher komme ich mir nicht allzu blöd vor.
Nun ist es relativ schwierig, herauszubekommen, wie man am besten eine Installationsroutine bewerkstelligt, die die erforderliche Runtime mit installiert. Leider reicht es ja nicht aus, einfach die benötigten dlls in dem Installationsorder zu installieren, da kommen einem jetzt die Manifest-Dateien in die Quere.
Ich kann mit meinem VS2008 ein Setup-Projekt dem Programmprojekt hinzufügen. Das bedient sich allerdings nicht besonders intuitiv und die Dokumentation läßt mich da auch ziemlich im Stich. Es ist zwar möglich, den resultierenden Installer so zu konfigurieren, daß er auf Vorhandensein von .net 2.0 prüft und ggf. einen Download anbietet, desweiteren, daß er die Vcredist_x86.exe mitliefert. Leider resultiert dann keine einzelne Installationsdatei, sondern ich habe eine setup.exe, eine .msi Datei und einen Unterordner mit der Vcredist. Ich hätte das aber gerne in einer einzelnen herunterladbaren Datei.
Mein bevorzugter Installer InnoSetup (glückliches Delphi!) kann per Pascal-Scripting auch schön auf das Vorhandensein von .net prüfen und einen Download anbieten. Ferner kann ich die Vcredist_x86.exe mitliefern und installieren. Das Problem ergibt sich aber schon da, wo ich gerne prüfen möchte, ob die Vcredist schon istalliert ist. Da werden nämlich unter XP und Vista im Ordner WinSxS unterschiedliche Verzeichnisse mit kryptischem Namen angelegt.Nun hatte ich gedacht, am einfachsten sei es, die benötigten dlls mitzuliefern und die Manifeste anzupassen. Die einzige funktionierende Anleitung dazu habe ich hier gefunden:
http://blog.kalmbach-software.de/2008/05/03/howto-deploy-vc2008-apps-without-installing-vcredist_x86exe/
Das funktioniert so auch prima unter XP, aber auf meinem Vista-Rechner, (auf dem die VCRuntime schon installiert ist) kommt es bei Ausführung meines Progamms zu ständigen Fehlern des JIT-Compilers, der bemeckert, daß auf geschützte Bereiche geschrieben wird. Da das Programm unter XP läuft und unter Vista ohne diese lokalen dlls ebenfalls läuft, denke ich nicht, daß es an meinem Programm liegt, oder?Also, meine Frage: Was mache ich falsch? Wie löst ihr das Problem mit der Weitergabe eurer VC2008-Programme? Warum muß das alles so kompliziert sein? Sollte man für .net lieber C# lernen?
-
und wieder die eingehende Frage, hast du die Release oder die Debug datei verwendet??
-
Selbstverständlich habe ich die Release Version verwendet. Auf XP-Rechnern geht es ja einwandfrei. Auf Vista-Rechnern geht es auch, wenn die VCRedist installiert wird, was ich ja gerne vermeiden würde.
-
klärt mich mal auf, worin sich die debug und die Release-Version unterscheiden?
Ich habe aktuell ein Problem, das ich ein Projekt zwar als Debug-Version erstellen kann, aber nicht als Release (da kommen noch Fehler, warum auch immer).
gruß
Edit: die Fehler in der Release-Version konnte ich mittlerweile beheben, musste den Zeichensatz von Uni- auf Multibyte umstellen.
Jetzt muss ich noch das Problem mit der vcredist lösen... -.-
-
Die debug version wird aus dem Compiler gestartet und läuft nur aus diesem, die Release version läuft (kann man so sagen) aus eigener kraft. Der vorteil der Debug version ist das fehler im Compiler mit einer anständigen meldung gezeigt werden, die Release version dagegen wird nur mit der meldung (Problem senden/nicht senden) abgebrochen.
Das ist aber nur der Hauptteil.
-
Ich habe mein Problem jetzt pragmatisch gelöst: Ich habe mein Programm nach C# migriert. Ursprünglich war meine Idee, unter .net nicht noch eine zusätzliche Sprache erlernen zu müssen, aber der Umstieg war jetzt viel leichter als gedacht. Bei den Galileo OpenBooks gibt es ein passendes Buch dazu, dort mußte ich nur wenige Dinge nachlesen. Wenn mann die Visual Studio IDE zweimal öffnet, kann man das C++ und das C# Projekt gleichzeitig offen haben. Die Steuerelemente der Form lassen sich durch Copy und Paste sofort in das C# Projekt übernehmen. Auch den Code konnte ich großenteils durch Copy und Paste übernehmen und mußte dann nur noch ein paar Anpassungen machen (z. B. . statt -> und ::, string statt String^). Ich habe festgestellt, daß der Komfort und die Geschwindigkeit unter C# deutlich besser sind, man merkt, daß die IDE eigentlich für C# geschrieben ist. Auch so simple Dinge wie das Festlegen eines Icons für die Anwendung oder des Einbringen von Copyright-Informationen geht jetzt einfach und so wie ich es mir vorgestellt hatte. Die fertige exe ist einiges kleiner und die Probleme mit einer notwendigen Laufzeit-Bibliothek sind nicht mehr vorhanden.
-
denjo303 schrieb:
Die debug version wird aus dem Compiler gestartet und läuft nur aus diesem,
Nicht wirklich, die Debug Version ist üblicherweise nur weniger (garnicht) optimiert, und hat andere Abhängigkeiten - oft Abhängigkeiten auf DLLs die nur mit dem Compiler mitkommen und die man auch nicht mit ausliefern darf. Man muss sie aber nicht "aus dem Compiler heraus" starten. Bei anderen Compilern wiederum (GCC/MinGW, ...) kann man die Debug Version genauso ausliefern - entweder statisch gelinkt oder indem man die nötigen DLLs einfach mitgibt.
-
Ich habe mittlerweile auch die C++ Version unter Vista ans Laufen gebracht. Problem war folgende Funktion (Umwandlung eines Integer in einen std::string):
void IntToString(int i, string& res) { ostringstream temp; temp << i; res = temp.str(); }
Diese führt bei lokalem Weitergeben der dlls und nur unter Vista zu folgendem Fehler:
************** Ausnahmetext **************
System.AccessViolationException: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
bei delete(Void* )
bei std.ios_base._Ios_base_dtor(ios_base* ) in f:\dd\vctools\crt_bld\self_x86\crt\src\ios.cpp:Zeile 58.
bei std.ios_base._Ios_base_dtor(ios_base* )
bei std.basic_ostringstream<char,std::char_traits<char>,std::allocator<char> >.__vbaseDtor(basic_ostringstream<char\,std::char_traits<char>\,std::allocator<char> >* )
bei IntToString(Int32 i, basic_string<char\,std::char_traits<char>\,std::allocator<char> >* res)Keine wirkliche Ahnung, warum.