Visual Studio 2010: Assiemi di riferimento che mirano a una versione più alta del framework

Visual Studio 2008 ti consentiva di fare riferimento a un assembly A da un assieme B quando A era destinato a .NET 3.5 e B era rivolto a .NET 2.0.

Visual Studio 2010 non consente più questo. Il problema completo è descritto su MSDN :

È ansible creare applicazioni che fanno riferimento a progetti o assiemi destinati a versioni diverse di .NET Framework. Ad esempio, se si crea un’applicazione destinata al profilo client .NET Framework 4, tale progetto può fare riferimento a un assembly destinato a .NET Framework versione 2.0. Tuttavia, se si crea un progetto destinato a una versione precedente di .NET Framework, non è ansible impostare un riferimento in quel progetto a un progetto o un assieme destinato al profilo client .NET Framework 4 o .NET Framework 4 . Per eliminare l’errore, assicurati che il profilo preso di mira dalla tua applicazione sia compatibile con il profilo preso di mira dai progetti o dagli assembly a cui fa riferimento la tua applicazione.

C’è un modo in cui posso fare in modo che VS2010 si comporti come VS2008 a questo proposito (ad esempio, consentendo riferimenti ad assiemi destinati a versioni di framework più alte)?

Conosco il ragionamento dietro il comportamento di VS 2010 e le considerazioni sulla distribuzione di cui ho bisogno di essere consapevole, non c’è bisogno di ripeterlo.

L’errore esatto è:

avviso MSB3268: non è stato ansible risolvere il riferimento primario “xxx.dll” perché ha una dipendenza indiretta sull’assembly framework “System.Core, Versione = 3.5.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089″ che non è stato ansible risolvere in il quadro attualmente mirato. ” .NETFramework, Version = v2.0″ . Per risolvere questo problema, rimuovere il riferimento “xxx.dll” o redirect l’applicazione a una versione di framework che contiene “System.Core, Versione = 3.5.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089”.

Passaggio 1: scarica il progetto di riferimento con targeting per .NET 2.0

Passaggio 2: fare clic con il pulsante destro del mouse sul progetto scaricato e selezionare Modifica dal menu di scelta rapida

Step3: aggiungi true al riferimento. Di seguito è riportato un esempio dalla mia soluzione di riproduzione:

  {8DD71CAF-BEF7-40ED-9DD0-25033CD8009D} HighFX true  

Passaggio 4: ricarica il progetto.

Ora dovresti essere in grado di creare all’interno di Visual Studio 2010, potrebbe esserci comunque un avviso come sotto, ma la compilazione può avere successo.

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

La numerazione della versione di .NET Framework è diventata un disastro dopo 2.0. Un assembly non ha come target una versione di .NET framework, ma ha come target una versione CLR. E la versione CLR per le versioni di framework 2.0, 3.0 e 3.5 era la stessa, 2.0.50727.

Questo è il motivo per cui sembrava che potessi mescolare le versioni in VS2008. Ma stavi vedendo la [AssemblyVersion] di un assembly, che non ha nulla a che fare con la versione CLR. Sfortunatamente, la versione CLR non è visibile nella finestra Proprietà, dovresti eseguire Ildasm.exe per vederlo nei metadati. Ma si può tranquillamente supporre che qualsiasi versione di assemblaggio tra 2.0.0.0 e 3.5.0.0 abbia come target la versione CLR 2.0.50727

Finito con .NET 4.0, ha ottenuto una nuova versione CLR, 4.0.30319. Quello che la descrizione di MSDN dice che quando si target CLR versione 2.0, non è ansible utilizzare gli assembly con target 4.0. La versione 2.0 CLR non sa come leggere i metadati di un assembly .NET 4.0, il formato è stato modificato. L’unica soluzione è forzare l’EXE a caricare la versione 4.0 del CLR, anche se richiede 2.0.50727. Lo fai con un file app.exe.config, dovrebbe assomigliare a questo:

      

E un po ‘di test che funziona ancora correttamente, Microsoft ha utilizzato la v4.0 per correggere diversi vecchi bug in 2.0 che non potevano essere facilmente risolti senza correre il rischio di rompere il vecchio codice che si basava sul comportamento del buggy.

 Add true to the reference 

In una soluzione di grandi dimensioni con molti progetti che si riferiscono l’un l’altro, questo potrebbe avere un effetto a cascata, che è un problema da risolvere manualmente. Per automatizzare il processo, ho scritto lo script PowerShell di seguito. .csproj nel livello più alto della soluzione: lo script ricerca ricorsivamente i file .csproj e aggiorna gli elementi ProjectReference che corrispondono ai GUID parziali (che devi specificare modificando la riga pertinente dello 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) { # true $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") 

Per favore vai al Visual Studio 2015

  1. Innanzitutto, procedi con il tasto destro del mouse sul tuo progetto
  2. Seleziona le proprietà del progetto
  3. Seleziona la scheda Applicazione (scheda Predefinita)
  4. Modificare il framework di destinazione nel framework desiderato per quel progetto specifico. L’immagine per questo processo è mostrata qui