/clr:pure /MD kompiliertes Projekt läuft auf anderen Rechnern nur mit Manifestdatei
-
Hallo
Ich brauch mal eure Hilfe, bei der Projektkonfiguration eines VS 2005 Projektes.
Kompiliert wird es mit den Optionen /clr:pure und in dem Punkt Laufzeitbiliotheken steht Multithreaded-DLL, also /MD. Soweit ich mich in die Thematik CLR/MSIL und .Net eingelesen habe, heißt das so viel "dynmisches Linken gegen die Dateien msvcr.dll, msvcm.dll, etc. Da ich VS 2005 einsetze heißen die bei mir dementsprechend ja auch msvcr80.dll, msvcm80.dll, usw.
Nun läuft das Projekt ja bei mir auf dem Rechner einwandfrei. Auf den anderen Rechnern brauche ich ja durch die dynamische Verlinkung gegen die .Net DLLs (Ich nenn sie jetzt einfach mal so.) das Redistributable Package von MS oder Alternativ die einzelnen DLL-Dateien im selben Verzeichnis, wie die Exe.
Auf dem Testrechner hab ich die auch installiert gehabt, nur leider funktionierte meine EXE trotzdem nicht. "Fehlermeldung Anwendungskonfiguration...". Nachdem ich eine Weile gesucht hab und auch die drei verdächtigen DLL-Dateien (msvcr80.dll, msvcp80.dll, msvcm80.dll) im selben Ordner hab, hab ich mal die Manifestdatei "Microsoft.VC80.CRT.manifest" aus dem Redistverzeichnis in das Ausführungsverzeichnis kopiert und siehe da, plötzlich funktioniert die Datei.
Nun möchte ich aber nicht jedes mal die DLL-Dateien und die Manifestdatei dem Projekt mit dazulegen, sondern nur das Redistributable Package bzw. einen Link dazu, aber dann funktioniert das Projekt ja nicht.
Daher meine Frage. Was muss ich denn in den Projekteinstellungen einstellen, dass die Manifestdatei "Microsoft.VC80.CRT.manifest" nicht mehr benötigt wird.
Auch bin ich an einer Erklärung interessiert, wieso die Datei benötigt wird.Danke für die Hilfe.
Grüße Daimonion
-
daimonion schrieb:
Alternativ die einzelnen DLL-Dateien im selben Verzeichnis, wie die Exe.
Nein. Du brauchst nicht nur die DLLs, sondern auch das Manifest der CRT/MFC/ATL!!!
daimonion schrieb:
hab ich mal die Manifestdatei "Microsoft.VC80.CRT.manifest" aus dem Redistverzeichnis in das Ausführungsverzeichnis kopiert und siehe da, plötzlich funktioniert die Datei.
Genau, so soll es sein.
daimonion schrieb:
Nun möchte ich aber nicht jedes mal die DLL-Dateien und die Manifestdatei dem Projekt mit dazulegen, sondern nur das Redistributable Package bzw. einen Link dazu, aber dann funktioniert das Projekt ja nicht.
WARUM nicht? Wenn Du das redist_vc86.exe installierst, geht es genauso...
daimonion schrieb:
Daher meine Frage. Was muss ich denn in den Projekteinstellungen einstellen, dass die Manifestdatei "Microsoft.VC80.CRT.manifest" nicht mehr benötigt wird.
Gar nichts... das ist für die DLL Version zwingend notwendig.... für den Grund brauchst Du nur den CRT Source anschauen, da wird ja die Meldung abgesetzt... und eben genau dann, wenn diese Datei fehlt).
-
Danke für deine Antwort Jochen.
Deinen Blog hab ich schon durchgelesen. Okay, wenn ich die Manifestdatei brauche, dann stellt sich die Frage nicht wie ich es ohne diese hin bekomme. Allerdigngs stellt sich mir jetzt die Frage, wieso mein Projekt auf meinem Testrechner nicht lief, obwohl ich das Redistributable Package installiert hab.
Kannst du mir das erklären, oder hast du einen Ansatz warum das nicht ging?
Grüße
Daimonion
-
So, Lösung gefunden.
Folgender Blogbeitrag, bzw. Diskussion hat mich auf die Lösung gebracht:
http://stackoverflow.com/questions/1582844/vcredist-x86-dll-and-version-8-0-50727-4053
Ursprüngliches Problem war ja, wie schon gesagt, dass mein Programm die Redistributable DLLs nicht gefunden hat.
Wenn ich sie als lokale Assemblys mitliefere, dann brauchte ich dazu auch die entsprechende Manifestdatei, wie man unter Microsoft nachlesen kann.
http://msdn.microsoft.com/de-de/library/ms235342(VS.80).aspx
http://msdn.microsoft.com/de-de/library/ms235531(v=VS.80).aspx
http://msdn.microsoft.com/de-de/library/ms235291(v=VS.80).aspxDie vcredist_x86.exe die dabei verlinkt wurde, installiert aber nicht die Pakete die gebraucht werden. Das hab ich herausgefunden, als ich mal die Versionsnummern der DLL verglichen habe.
Ich brauche nämlich die Version 8.0.50727.4053. Die entsprechende vcredist_x86.exe hab ich dann auf meinen Rechner unter \Programme\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86 gefunden und nachdem diese auf den Clientrechnern installiert wurde, läuft mein Programm auch ohne, dass ich die DLLs und die Manifestdatei dazulege!
Grüße
Daimonion
-
Ja, ich hatte vergessen den Link zu aktualisieren... siehe auch:
http://blog.kalmbach-software.de/de/2009/10/20/vcredist-fur-vs2008-atl-security-update/