Ansi C++ in VS und braucht dennoch dot net?!



  • Ich entwickele in einer Windows Umgebung mittels Visual Studio 2008.

    Obwohl ich mir ziemlich sicher bin, dass ich ANSI C++ entwickelt habe und auch nicht mit CLI kompiliert.
    Dennoch will er beim Ausführen immer die .net 3.5 Runtime und stellenweise auch mehr. Bei Computern ohne VS 2008, aber mit .net 3.5 Runtime laufen die C++ Programme dennoch nicht.

    Gibt es eigentlich einen Weg, das .net aus der Geschichte rauszukriegen?



  • Seikilos schrieb:

    Gibt es eigentlich einen Weg, das .net aus der Geschichte rauszukriegen?

    Erstelle einfach eine Win32-Konsolenanwendung, ein Win32-Projekt oder eine MFC-Anwendung (oder entsprechende DLL- oder OCX-Projekte), dann hast du auch nix mit .NET zu schaffen. Hast du zufällg "Windows Forms" gewählt, als du dein Projekt erstellt hast? Das wäre nämlich eine .NET-Anwendung...



  • Seikilos schrieb:

    Bei Computern ohne VS 2008, aber mit .net 3.5 Runtime laufen die C++ Programme dennoch nicht.

    Schau dir mal an, was Debug und was Release ist.



  • Vermutlich linkst Du gegen die DLL-Version der CRT und hast vergessen diese DLLs zu installieren.
    Ich rate dazu gegen die LIB-version zu linken, dann hast Du keine solche Probleme:
    http://blog.kalmbach-software.de/de/2008/03/05/wie-man-statisch-gegen-die-c-runtime-crt-linkt/



  • _matze schrieb:

    Seikilos schrieb:

    Gibt es eigentlich einen Weg, das .net aus der Geschichte rauszukriegen?

    Erstelle einfach eine Win32-Konsolenanwendung, ein Win32-Projekt oder eine MFC-Anwendung (oder entsprechende DLL- oder OCX-Projekte), dann hast du auch nix mit .NET zu schaffen. Hast du zufällg "Windows Forms" gewählt, als du dein Projekt erstellt hast? Das wäre nämlich eine .NET-Anwendung...

    Natürlich habe ich eine Consolen applikation erstellt, sonst würd ich mich ja nicht wundern 🙂

    Zu dem Rest, ich werde es gleich mal testen.

    aber ich habe kein Ton, also höre ich die Erklärungen leider nicht.
    Was ist denn das Problem mit dem Linken gegen die DLL? Er link dann gehen die dot net 3.5 DLL richtig?
    Wenn ja, wieso linkt er statisch dann zu der richtigen?



  • Also wenn Jochens Lösung dein Problem löst, dann hast du statisch gegen die CRT (nix .NET) gelinkt und somit dafür gesorgt, dass dein Programm auch auf Rechnern läuft, die die C-Runtime nicht installiert haben. In dem Fall sollte es aber doch kein Problem auf deinem Rechner gegeben haben (denn so hört sich dein Post für mich irgendwie an). Und ich schätze mal, so wird es auch sein, denn eine Win32-Konsolenanwendung braucht kein .NET-Framework. Du sagst ja auch, dass dieses auf anderen Rechnern quasi nix bringt und das Programm trotzdem nicht läuft. Jetzt frage ich mich nur, warum du auf deinem Rechner der Ansicht bist, dieses würde benötigt (habe ich zumindest so verstanden).



  • Auf meinem Rechner ist es auch kein Problem und dennoch war Jochens Lösung die richtige.

    Testszenario hier: Mein PC VS 2008, ich erstelle ne Win32 Consolenanwendung und stopf da Hello World in stdout.
    Code Gen ist auf Multithreaded Debug DLL. Bei mir läufts.
    Beim Computer nebenan, der Vs 2005 drauf hat, läuft es nicht, da kommt diese Side by Side Config Fehlermeldung.
    Stelle ich Code Gen auf statisch, klappt es auch bei dem Rechner mit Vc 2005.

    Wenn ich dynamisch linke, so hab ich .NET im Boot?



  • Ich weiß nicht, wie du auf .NET kommst. Die CRT hat damit nix zu tun...



  • Ok, dann verstehe ich was falsch.
    Aus welchem Grund funktioniert meine c++ anwendung nicht auf einem Rechner mit VS 2005 ? Dieser müsste doch eine CRT haben, oder nicht?



  • Seikilos schrieb:

    Ok, dann verstehe ich was falsch.
    Aus welchem Grund funktioniert meine c++ anwendung nicht auf einem Rechner mit VS 2005 ? Dieser müsste doch eine CRT haben, oder nicht?

    Das sind für's VS2008 aber andere DLLs, als mit dem VS2005 installiert wurden. Es gibt ja nicht nur eine CRT, sondern eben verschiedene Versionen.

    🙂



  • Ja eben, wieso klappt es dann statisch und dynamisch nicht?



  • Mit den neuen Studioversionen (ich glaube seit Version 7, bin aber nicht sicher) gibt es zu jeder DLL noch ein sogenanntes Manifest. Da steht drin welche DLLs in welcher Version benötigt werden.

    Beim Programmstart "verlangt" das Programm jetzt crt.dll Version 1.9 (Name und Version sind nur Beispiele). Auf dem System gibt es nur crt.dll Version 1.8 -> Programm startet nicht.

    Linkst du statisch, heisst das nichts anderes, als dass die DLL in die exe eingebaut wird. Deine exe Datei sollte auch größer werden (im Vergleich zum dynamischen Linken).
    Beim Programmstart wird nicht mehr nach ner DLL geschaut, denn die ist ja nun Teil der exe.

    Nachteil: gibt es Updates hat dein Programm nichts davon
    Vorteil: du musst für Programm x nicht sicherstellen, dass die DLL auf den Systemen vorhanden ist.

    Mal grob gesprochen 🙂



  • Seikilos schrieb:

    Aus welchem Grund funktioniert meine c++ anwendung nicht auf einem Rechner mit VS 2005 ? Dieser müsste doch eine CRT haben, oder nicht?

    Neee... woher sollen die anderen Rechner die CRT DLLs haben????
    Du musst das (passende) vcredist_x86.exe auf den Zielrechnern ausführen, dann geht es. Oder eben statisch linken, damit Du keine CRT-DLLs benötigst.


Anmelden zum Antworten