web-dev-qa-db-fra.com

Visual Studio 2010: assemblys de référence ciblant une version de framework supérieure

Visual Studio 2008 vous a permis de référencer un assembly A à partir d'un assembly B lorsque A ciblait .NET 3.5 et B ciblait .NET 2.0.

Visual Studio 2010 ne permet plus cela. Le problème complet est décrit sur MSDN :

Vous pouvez créer des applications qui référencent des projets ou des assemblys qui ciblent différentes versions du .NET Framework. Par exemple, si vous créez une application qui cible le profil client .NET Framework 4, ce projet peut référencer un assembly qui cible .NET Framework version 2.0. Cependant, si vous créez un projet qui cible une version antérieure du .NET Framework, , vous ne pouvez pas définir une référence dans ce projet à un projet ou un assembly qui cible le profil client .NET Framework 4 ou le .NET Framework 4 . Pour éliminer l'erreur, assurez-vous que le profil ciblé par votre application est compatible avec le profil ciblé par les projets ou assemblys référencés par votre application.

Existe-t-il un moyen de faire en sorte que VS2010 se comporte comme VS2008 à cet égard (c'est-à-dire en autorisant des références à des assemblys ciblant des versions de framework plus élevées)?

Je connais le raisonnement derrière le comportement de VS 2010 et les considérations de déploiement dont je dois être conscient, pas besoin de répéter cela.

L'erreur exacte est:

avertissement MSB3268: La référence principale "xxx.dll" n'a pas pu être résolue car elle dépend indirectement de l'assembly du framework "System.Core, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089" qui n'a pas pu être résolu dans le cadre actuellement ciblé. ".NETFramework, Version = v2.0". Pour résoudre ce problème, supprimez la référence "xxx.dll" ou recibler votre application vers une version de framework qui contient "System.Core, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089".

35
Johannes Rudolph

Étape 1: décharger le projet de référencement ciblant .NET 2.0

Étape 2: cliquez avec le bouton droit sur le projet déchargé et sélectionnez modifier dans le menu contextuel

Étape3: ajouter <SpecificVersion>true</SpecificVersion> à la référence. Voici un échantillon de ma solution de repro:

<ProjectReference Include="..\HighFX\HighFX.csproj">
  <Project>{8DD71CAF-BEF7-40ED-9DD0-25033CD8009D}</Project>
  <Name>HighFX</Name>
  <SpecificVersion>true</SpecificVersion>
</ProjectReference>

Étape 4: rechargez le projet.

Maintenant, vous devriez pouvoir construire dans Visual Studio 2010, il pourrait toujours y avoir un avertissement comme ci-dessous, mais la construction peut réussir.

Source: http://social.msdn.Microsoft.com/Forums/en-US/msbuild/thread/dfadfb34-5328-4c53-8274-931c6ae00836

44
Johannes Rudolph

La numérotation des versions du framework .NET est devenue un gâchis après 2.0. Un assembly ne cible pas une version du framework .NET, il cible une version CLR. Et la version CLR pour les versions de framework 2.0, 3.0 et 3.5 était la même, 2.0.50727.

C'est pourquoi il semblait comme si vous pouviez mélanger des versions dans VS2008. Mais vous voyiez la [AssemblyVersion] d'un Assembly, ce qui n'a rien à voir avec la version CLR. Malheureusement, la version CLR n'est pas visible dans la fenêtre Propriétés, vous devez exécuter Ildasm.exe pour la voir dans les métadonnées. Mais vous pouvez sans risque supposer que toute version d'assembly entre 2.0.0.0 et 3.5.0.0 cible la version 2.0.50727 de CLR.

Cela s'est terminé avec .NET 4.0, il a obtenu une nouvelle version CLR, 4.0.30319. Ce que le texte de présentation MSDN vous dit que lorsque vous ciblez CLR version 2.0, vous ne pouvez pas utiliser d'assemblys qui ciblent 4.0. La version 2.0 CLR ne sait pas lire les métadonnées d'un assembly .NET 4.0, le format a été modifié. La seule solution consiste à forcer l'EXE pour charger la version 4.0 du CLR, même s'il demande 2.0.50727. Vous faites cela avec un fichier app.exe.config, il devrait ressembler à ceci:

<configuration>
  <startup>
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

Et pour tester qu'il fonctionne toujours correctement, Microsoft a utilisé la v4.0 pour corriger plusieurs anciens bogues de 2.0 qui ne pouvaient pas être facilement résolus sans prendre le risque de casser l'ancien code qui reposait sur le comportement du bogué.

21
Hans Passant
Add <SpecificVersion>true</SpecificVersion> to the reference

Dans une grande solution avec de nombreux projets se référençant, cela pourrait avoir un effet en cascade, ce qui est difficile à corriger manuellement. Pour automatiser le processus, j'ai écrit le script PowerShell ci-dessous. Exécutez-le au niveau supérieur de votre solution - le script recherche récursivement .csproj fichiers et met à jour les éléments ProjectReference correspondant aux GUID partiels (que vous devez spécifier en modifiant la ligne appropriée du script).

dir -recurse -filter *.csproj | foreach { 
    $xml = New-Object XML

    $xml.Load($_.FullName)

    # we want the ItemGroup that contains the references
    $itemgroup = $xml.Project.ItemGroup | where { $_.ProjectReference }
    # Project GUIDs to search for... (edit as needed for your projects)
    $projrefs = $itemgroup.ProjectReference `
        | where { !$_.SpecificVersion `
            -and ( $_.Project -like "*CF2185B1*" `
                -or $_.Project -like "*CF2185B2*" `
                -or $_.Project -like "*CF2185B3*") `
        }

    if ($projrefs) {
        Write-Host $_.FullName

        foreach($ref in $projrefs) {
            if($ref) {
                # <specificversion>true</specificversion>
                $el = $xml.CreateElement("SpecificVersion", $xml.Project.xmlns) 
                $el.InnerText = "true"
                $ref.AppendChild($el) | out-null
                Write-Host "    updated: " $ref.Name
            }
        }

        $xml.Save($_.FullName) 
    }
}

Write-Host "Press any key to continue ..."
$Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
6
Justin M. Keyes

Veuillez accéder à Visual Studio 2015

  1. Commencez par faire un clic droit sur votre projet
  2. Sélectionnez les propriétés du projet
  3. Sélectionnez l'onglet Application (onglet par défaut)
  4. Changez le cadre cible pour le cadre souhaité pour ce projet spécifique . l'image pour ce processus est affichée ici
1
Ashish Pandey