none
c++ assembly auf anderem pc? RRS feed

  • Frage

  • Hi,
    Ich habe ein Projekt, das hauptsächlich in c# geschrieben ist. Da ich eine Win32-dll nutzen muss, habe ich mir in c++ einen wrapper geschrieben, der soweit auch funktioniert. Wenn ich dieses Programm nun auf einem anderen PC installiere, stürzt es sofort mit einer system.io.filenotfoundexception ab. Der DependencyWalker hat ergeben, dass die msjava.dll fehlt.
    Die VC++ redistributables (hoffe richtig geschrieben) habe ich für VS2008 installiert. Die fehlende dll habe ich zuerst mit der java-runtime von sun versucht, ging nicht - danach habe ich sie von Hand ins system32 Verzeichnis kopiert und per regsvr registriert.
    Trotzdem geht es nicht.
    Wenn ich ein VC++ Express installiere funktionierts auch auf dem anderen PC.

    Was muss ich noch installieren, dass es auch ohne Visual Studio geht?

    Gruß,
    Jürgen
    Montag, 29. Juni 2009 11:26

Antworten

  • Du darfst auf einen System, was kein VS hat nur die *Release* Version Deines Programmes ausführen!
    Die Debug-Version darfst Du nicht verteilen!
    Erstelle alles als Release und verteile diese...
    Jochen Kalmbach (MVP VC++)
    Montag, 29. Juni 2009 18:58

Alle Antworten

  • Schau mal in den EventLog, was da genau für eine Fehlermeldung drin steht... ich vermute eher, das hat was mit den Manifests zu tun...

    PS: Warum hast Du überhaupt einen Wrapper erstellt? Normal kann man die "meisten" Win32-APIs auch direkt aus C# ansprechen... um was für eine Funktion handelt es sich denn?
    Jochen Kalmbach (MVP VC++)
    Montag, 29. Juni 2009 12:08
  • Hier die Beschreibung aus dem Event-Log:

    Bevor ich die msjava.dll hineinkopiert habe:

    EventType clr20r3, P1 s_i imaging.exe, P2 1.0.3464.27879, P3 4a44db3e, P4 s_i imaging, P5 1.0.3464.27879, P6 4a44db3e, P7 f, P8 0, P9 system.io.fileloadexception, P10 NIL.
    Kategorie: Keine
    Ereigniskennung: 5000


    Nachdem ich sie reinkopiert habe:

    Faulting application s_i imaging.vshost.exe, version 9.0.21022.8, stamp 47316898, faulting module kernel32.dll, version 5.1.2600.2180, stamp 411096d4, debug? 0, fault address 0x0001eb33.
    Kategorie: Keine
    Ereigniskennung: 1000


    Warum funktionierts dann, wenn das Visual Studio installiert ist, wenns an den Manifests liegen könnte?

    Jürgen
    Montag, 29. Juni 2009 12:46
  • Hatte ich noch vergessen:
    Der Wrapper macht noch ein bischen mehr. Er bereitet Daten auf, die von einem CCD-Kameratreiber kommen.
    Ich hatte vorher einen in C# programmiert, aber die Win32-dll ist so bescheiden programmiert, dass das unter Vista sonst nicht lief.
    Montag, 29. Juni 2009 12:48
  • Warum startes Du den vshost-Prozess?
    Jochen Kalmbach (MVP VC++)
    Montag, 29. Juni 2009 13:04
  • Keine Ahnung :-(
    Der wird erzeugt, wenn ich das Projekt im Visual Studio starte.
    Montag, 29. Juni 2009 13:32
  • Wenn ich die vshost dateien lösche ist es das gleiche ergebnis.
    Aber was ist denn anders für mein programm, ob ich Visual Studio installiere oder nicht.
    Das können doch nur irgendwelche Laufzeit-Sachen sein, die zusätzlich installiert werden, oder?
    Montag, 29. Juni 2009 13:39
  • Es könnten andere Runtime Bibliotheken vorhanden sein, oder es fehelen bestimmte Runtimes...
    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 29. Juni 2009 14:20
    Moderator
  • Aber ich kann doch nur die Standard-Runtimes installieren, die VS spezifisch sind.
    Ich benutze nichts außergewöhnliches außer eben die Win32-dll, auf die ich zugreife.
    Diese habe ich per lib-Datei ins Projekt eingebunden.

    Ich muss gleich mal testen, ob es sich nur um ein Windows XP - Problem handelt und ob es evtl. auf Vista läuft.
    Montag, 29. Juni 2009 14:36
  • Lass doch mal Depends mit dem Programm mitlaufen und protokilliere ob da was anderes geladen wird.
    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 29. Juni 2009 16:18
    Moderator
  • Mit Depends meinst Du den Dependency Walker, oder?
    Hatte ich schon versucht. Unter WinXP konnte die Datei msjava.dll nicht geladen werden (wofür die auch immer gebraucht wird) und unter Windows 7 fehlt die IEShims.dll.
    Ich glaube aber nicht, dass das das Problem ist.

    Das ist ein Bild von 2 Ereignissen, die im Eventlog unter Win7 eingetragen sind.
    Vielleicht hilft das ja.




    Ich muss dazu sagen, dass das seit irrsinnig langer Zeit das erste C++ Programm überhaupt ist, was ich geschrieben habe.
    Vielleicht liegt es auch nur an den Einstellungen. Darf ich die Assembly als Debug-Version erstellen?

    Jürgen
    Montag, 29. Juni 2009 17:34
  • Du darfst auf einen System, was kein VS hat nur die *Release* Version Deines Programmes ausführen!
    Die Debug-Version darfst Du nicht verteilen!
    Erstelle alles als Release und verteile diese...
    Jochen Kalmbach (MVP VC++)
    Montag, 29. Juni 2009 18:58
  • Ich werds morgen versuchen.
    Danke erstmal ...
    Montag, 29. Juni 2009 19:08
  • Ok, es funktioniert.
    War ne schwere Geburt :-)

    Aber noch ne Frage:
    Das mit dem Release betrifft aber nur C++ Assemblys, oder liege ich da falsch?
    Weil normale C# Anwendungen laufen auch ohne explizite Release-Version.

    Danke nochmal,
    Jürgen
    Dienstag, 30. Juni 2009 09:58
  • Ja, bei C#-Anwendungen werden trotzdem die gleichen DLLs (Assemblies) geladen. Nur der JIT macht einige Dinge anders.

    bei C++/CLI sieht dies anders aus, da Du auf jeden Fall die shared DLLs der CRT verwenden musst und diese sind für Debug und Release unterschiedlich. Und nur die Release-Version darf man ausliefern...
    Jochen Kalmbach (MVP VC++)
    Dienstag, 30. Juni 2009 10:13
  • Ok, Danke nochmal für die Infos ...
    Dienstag, 30. Juni 2009 13:28