Neue Warnung in VS2010 nach Installation von .net 4.5 (oder VS2012)



  • Hallo,

    ich stelle gerade fest, dass in gemischten Projekten (native DLLs mit C++/CLI-Interface) bei der Übersetzung in VS2010 eine neue Compilerwarnung auftaucht, sobald man das Framework 4.5 auf dem Rechner hat.

    Er beschwert sich mit einer warning C4945, dass 'ExtensionAttribute' nicht aus system.core.dll geladen werden kann, weil sie bereits aus mscorlib.dll geladen wurde.

    Grund ist offenbar, dass diese Klasse im Framework 4.5 verschoben wurde. Benutzen tue ich die nicht (wissentlich), das Projekt soll auch weiterhin 4.0 als Ziel haben. Die wenigen Fundstellen im Netz beziehen sich nur auf die Betaversionen und die Abhilfe betrifft offenbar nur das Unterdrücken der Warnung.

    Kann man diese Warnung also getrost ignorieren ? Negative Effekte auf die erzeugten Programme konnte ich bisher nicht feststellen.



  • Hast Du ein einfaches Beispiel, wo der Fehler auftritt?



  • Ich kann gerne mal ein abgespecktes Testprojekt erzeugen, wenn ich dazu komme.

    Im Grunde handelt es sich bei dem betroffenen Projekt aber eine ganz normale als Win32-Projekt erstellte DLL. Dieser sind mehrere C++/CLI Klassen hinzugefügt, nur bei deren Quelldateien ist /clr gesetzt. Zusätzlich ist noch eine stdafx_clr.cpp für die precompiled Header der C++/CLI Teile eingefügt. Im Prinzip folgt der ganze Projektaufbau der Vorlage im Buch "Expert C++/CLI" von Marcus Heege. Die Interfaceklassen haben keine spektakulären Typen in den Funktionsparametern, nur int, string, List<string> und IPEndPoint.

    Die Warnungen kommen nur bei den Rechnern, auf denen schon das Framework 4.5 installiert ist, sowohl beim x86 als auch beim x64 Build. Unter XP als auch unter Win7 ohne .net 4.5 kommt diese Warnung nicht.



  • So ich konnte das jetzt noch einmal testen, die kommt immer in jeder gemischten DLL.

    Vorgehen zum Reproduzieren:

    Neues Win32 DLL Projekt in VS2010 anlegen.

    Datei hinzufügen "ManagedClass.h"

    #pragma once
    
    namespace Test
    {
        public ref class TestClass
        {
        public:
            TestClass();
        };
    }
    

    Datei hinzufügen "ManagedClass.cpp"

    #include "ManagedClass.h"
    
    using namespace Test;
    
    TestClass::TestClass()
    {
    }
    

    In den Eigenschaften von "ManagedClass.cpp" folgendes ändern (hier exemplarisch x86 Debug Mode), damit diese Datei als C++/CLI übersetzt wird:
    Debuginformationsformat: Programmdatenbank (/Zi)
    Common Language Runtime-Unterstützung (/clr)
    Minimale Neuerstellung: Nein (/Gm-)
    C++ Ausnahmen aktivieren: Ja bei SEH-Ausnahmen (/EHa)
    Vollständige Laufzeitüberprüfungen: Standard

    Übersetzen und da ist die Warnung C4945.

    Das gleiche unter XP oder Win7 ohne .net 4.5 liefert keine Warnung !



  • Das Problem kommt daher, dass Du nicht für das gesamte Projekt die "/clr" Option gesetzt hast. Das ist ja vom prinzip her sogar, die richtige Entscheidung 😉

    Das Problem ist jetzt, das per Default nun vom Compiler (msbuild) die Version 4.5 verwendet wird, was jetzt zu diesem Problem führt....

    Wenn Du jetzt ganz tief in die msbuild-Dateien reichschaut, dann stellst Du fest, dass es einen Trick gibt, damit VC2010 Projekte die korrekte Version verwenden:

    /clr:nostdlib

    Siehe dazu auch: http://msdn.microsoft.com/en-us/library/k8d11d4s.aspx
    Gib diese Option einfach bei Deiner Datei oder dem Projekt an.

    Nun musst Du noch sagen, welche Version von .NET verwendet werden soll. Das musst Du noch machen, indem Du die Folgende Einstellung setzt:
    C/C++|General|Resolve #using References:

    %ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0;%(AdditionalUsingDirectories)

    Damit lässt sich nun Dein Projekt wieder in VS2010 korrekt übersetzen.

    Ist das gesamte Projekt auf /clr umgestellt, so erkennt msbuild dies und setzt diese beiden Dinge automatisch.

    Hoffe, das löst Dein Problem...

    Siehe auch:
    https://connect.microsoft.com/VisualStudio/feedback/details/739838/msbuild-produces-new-warning-after-installing-net-4-5
    https://connect.microsoft.com/VisualStudio/feedback/details/697104/visual-studio-11-compile-warning-when-targeting-framework-v4-0-due-to-extensionattribute



  • Jochen Kalmbach schrieb:

    Damit lässt sich nun Dein Projekt wieder in VS2010 korrekt übersetzen.

    Auf den Rechnern, wo vorher die Warnung auftrat.
    Dafür hat man dann auf denen, wo vorher keine Warnung auftrat (XP), einen Fehler.

    Diese Connect-Einträge habe ich mir angesehen, die machen für 2012 Sinn, aber nicht für 2010, wenn es in der Firma noch Rechner geben muss, die mit älteren Betriebssystemen arbeiten. (Primäres Ziel dieses .net 4.0 Projektes ist XP Professional for Embedded Systtems.)

    Im Moment tendiere ich dazu, diese Warnung zu ignorieren. Mit der Warnung erzeugte DLLs laufen auch auf XP.


Anmelden zum Antworten