| 

.NET C# Java Javascript Exception

2
Hallo zusammen,

ich habe ein Problem mit einem C#/C++-Projekt unter VisualStudio 2008 bzw. 2010.
Ich habe als Basis mehrere C++-Projekte bekommen, die teilweise QT-Bibliotheken verwenden.
Für diese Logik habe ich nun eine GUI entwickelt (WPF / .NET 3.5). Die komplette Solution lässt sich ohne Fehler kompilieren.
Kopiere ich das kompilierte Programm (egal ob Debug oder Release) auf einen anderen PC lässt es sich nicht ausführen sondern bricht mit einer Exception ab, dass eine Datei fehlt. Leider kann ich nicht nachvollziehen welche Datei das ist...
Ich hab auch schon einen Installer erstellt, mit gleichem Erfolg. Alles lässt sich anstandslos installieren, das Programm lässt sich jedoch ebenso nicht starten und bricht ab.

Da ich mich im Bereich C++ leider nicht so gut auskenne, sitze ich nun etwas ratlos vor meinem Rechner.

Hat jemand einen Tip, an welcher Stelle ich "suchen" muss?

Bin für jede Antwort dankbar,
viele Grüße

BS
17.03.2011
TzmSchumacher 23 4
6 Antworten
4
Du kannst Dir mit FileMon (respektive Process Monitor, gibt's hier: http://technet.microsoft.com/de-de/sysinternals/bb896645) anschauen auf welche Dateien zugegriffen wird. Vielleicht hilft Dir das weiter herauszufinden was nicht gefunden werden kann.
17.03.2011
Jaksa 4,0k 2 8
3
Ähnliches Problem hatte ich weil ich die VS2008/VS2010 Runtime nicht auf dem Zielsystem installiert habe. (am besten findet das man mit DependencyWalker)
z.B. diese: VS2010 x86
Da musst nur auf die Version (SP1 usw.) und auf die Plattform (x86/x64)acht geben. Die Redistributables gibts von MS nur in der Release Version. Für Debug musst du dir selber ein kleines Setup schreiten.

Das zweite könnt sein: unterschiedliche Plattformen. Die c++ Dlls sind entwder x86 oder x64. Wenn du aber die c# Exe mit AnyCPU kompiliert wurde und das Zielsystem x64 ist. dan läuft dein Prog in x64 un kan die x86 dlls nicht laden.
Simple Abhilfe: alles mit x86 compilieren.
17.03.2011
GerhardK 398 1 7
Hallo GerhardK,

danke für Deine Antwort. An die Runtime habe ich auch schon gedacht. Leider brachte deren Installation auch keinen Erfolg.
Was mir noch augefallen ist, die C++-Dlls haben unter Eigenschaften das .NET-Framework 2.0 als Ziel, meine komplette Solution natürlich 3.5 (WPF). Kann das ein Problem sein?
TzmSchumacher 17.03.2011
Nein das glaube ich nicht da .Net3.5 nur ".Net2.0 mit zusätzlichen Assemblies" ist.
Kannst du nicht die Exception genauer untersuchen, dort könnte der FileNamen der nicht gefundenen DLL vielleicht Aufschluss geben
GerhardK 17.03.2011
Das ist eine System.IO.FileLoadException. Er kann die C++-Assembly, die die Schnittstelle zwischend der GUI und der Logik bildet nicht laden. Diese liegt allerdings meiner Meinung nach völlig korrekt im Anwendungsverzeichnis...
TzmSchumacher 17.03.2011
Also ich trau mich fast zu wetten, dass deiner c++ Dll eine andere native Dll fehlt. Öffne die Datei auf dem Zielsystem mit dem DependencyWalker. Der prüft alle notwendigen Abhängigkeiten und zeigt die fehlenden Dlls an.
GerhardK 17.03.2011
Wette gewonnen... msvcr80.dll und msvcr90dll, obwohl beide MergeModule im Installer integriert sind... Und nu stolpere ich im Minutentakt über neue fehlende Dlls...
TzmSchumacher 17.03.2011
:-) (wenn gelöst bitte als Antwort markieren)
GerhardK 17.03.2011
Leider ist es noch nicht gelöst, auch nach händischem nachinstallieren der fehlenden DLLs funkrionierts nicht... Kann ja eigentlich auch nicht sein, dass man die per Hand installieren muss...
Auch das Installieren der C++-Runtime Redistributable-Packages brachte keinen Erfolg.
Aber Deine Unterstützung hat mich auf die richtige Spur gebracht! - DANKE!
TzmSchumacher 18.03.2011
Schade, aber nur zur Info. msvcr80.dll und msvcr90.dll können nicht einfach kopiert werden. Sie müssen entweder mit dem Redistributable Paket oder als Merged Modul installiert werden!
GerhardK 18.03.2011
0
steht vielleicht etwas in der ereignisanzeige?
lg
17.03.2011
wuliwux 133 5
0
Ja, in der Ereignisanzeige steht was drin, leider fange ich mit diesem Eintrag aber nichts an...

.NET Runtime 2.0 Error Reporting

Ereigniskennung: 5000

EventType clr20r3,
P1 meinProgramm.exe,
P2 1.0.0.0,
P3 4d8218de,
P4 mscorlib,
P5 2.0.0.0,
P6 4889dc80,
P7 2b51,
P8 1bf,
P9 0mop1g1uiruhj2oebvas2dzpbs2s1e5w,
P10 NIL.

Es sind sowohl .NET 2.0 als auch 3.5 mit jeweils SP1 und den deutschen LanguagePacks installiert.
17.03.2011
TzmSchumacher 23 4
0
Inzwischen habe ich herausgefunden, dass im Manifest der obersten C++-Datei der Verweis auf die Microsoft.VC90.CRT eine andere Version ernthält, als die, die geladen wird, wenn ich das Programm direkt in der Entwicklugnsumgebung ausführe.

Weiß jemand, wie man diese Verweise ändern kann? Das Manifest ist eingebettet.
18.03.2011
TzmSchumacher 23 4
Ich vermute du meinst mit dem eingebetteten manifest ein automatisch generiertes manifest, das beim linken eingebettet wird (dabei wird die installierte vc90 runtime version verwendet). Du kannst aber selbst eine manifest datei anlegen und diese als resource hinzufügen.
Wenn eine andere Version geladen wird kann das durch eine policy (die ms mit updates für die vc runtime liefert um rückwärtskompatibilität zu gewährleisten) passieren. policy werden im winsxs verzeichnis abgelegt. vielleicht hilft das:
http://msdn.microsoft.com/en-us/library/ms235342.aspx
GerhardK 18.03.2011
0
So, nu ist das "Problem" gelöst:

Die in den Installer eingebundenen Mergemodule habe wohl nicht das getan was sie sollten.
Nun habe ich die MS.VC80-dlls direkt eingebunden, so dass sie in das Ausgabeverzeichnis kopiert werden. Und siehe da - es funktioniert!

Vielen Dank an alle, die geholfen haben!!
24.03.2011
TzmSchumacher 23 4

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH