Visual Studio 2010: ссылочные сборки Ориентация на версию с более высокой версией

Visual Studio 2008 позволила вам ссылаться на сборку A из сборки B когда A нацеливался на .NET 3.5, а B – на .NET 2.0.

Visual Studio 2010 больше этого не допускает. Полная проблема описана в MSDN :

Вы можете создавать приложения, которые ссылаются на проекты или сборки, предназначенные для разных версий .NET Framework. Например, если вы создаете приложение, предназначенное для профиля клиента .NET Framework 4, этот проект может ссылаться на сборку, предназначенную для .NET Framework версии 2.0. Однако, если вы создаете проект, который предназначен для более ранней версии .NET Framework, вы не можете установить ссылку в этом проекте на проект или сборку, ориентированную на профиль клиента .NET Framework 4 или .NET Framework 4 . Чтобы устранить эту ошибку, убедитесь, что профиль, предназначенный для вашего приложения, совместим с профилем, на который нацелены проекты или сборки, на которые ссылается ваше приложение.

Есть ли способ заставить VS2010 вести себя как VS2008 в этом отношении (т. Е. Разрешать ссылки на сборки, ориентированные на версии с более высокой версией)?

Я знаю аргументы в пользу поведения VS 2010 и соображений развертывания, о которых мне нужно знать, и не нужно повторять это.

Точная ошибка:

предупреждение MSB3268: основная ссылка «xxx.dll» не может быть решена, поскольку она имеет косвенную зависимость от сборки фреймворка «System.Core, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089», которая не может быть разрешена в в настоящее время целевые frameworks. ».NETFramework, Version = v2.0″ . Чтобы устранить эту проблему, удалите ссылку «xxx.dll» или перенастройте приложение в версию фреймворка, содержащую «System.Core, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089».

    Шаг 1. Выгрузите проект реферирования, ориентированный на .NET 2.0.

    Шаг 2: Щелкните правой кнопкой мыши на выгруженном проекте и выберите редактирование из контекстного меню

    Шаг 3: Добавьте ссылку true в ссылку. Ниже приведен образец из моего репродуктивного решения:

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

    Шаг4: Перезагрузите проект.

    Теперь вы должны иметь возможность создавать внутри Visual Studio 2010, все равно может быть предупреждение, как показано ниже, но assembly может быть успешной.

    Источник: http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/dfadfb34-5328-4c53-8274-931c6ae00836

    Нумерация версий .NET Framework стала беспорядочной после 2.0. Сборка не предназначена для версии .NET framework, она предназначена для версии CLR. Версия CLR для версий 2.0, 3.0 и 3.5 для платформ была одинаковой, 2.0.50727.

    Вот почему было похоже, что вы можете смешивать версии в VS2008. Но вы видели [AssemblyVersion] сборки, которая не имеет ничего общего с версией CLR. К сожалению, версия CLR не отображается в окне «Свойства», вам нужно запустить Ildasm.exe, чтобы увидеть ее в метаданных. Но вы можете смело предположить, что любая версия сборки между 2.0.0.0 и 3.5.0.0 предназначена для CLR версии 2.0.50727

    Это закончилось с .NET 4.0, оно получило новую версию CLR 4.0.30319. Что сообщение MSDN говорит вам, что, когда вы нацеливаете версию CLR версии 2.0, вы не можете использовать сборки, которые нацелены на 4.0. CLR версии 2.0 не знает, как читать метаданные сборки .NET 4.0, формат был изменен. Единственное решение – заставить EXE загружать версию CLR 4.0, даже если она запрашивает 2.0.50727. Вы делаете это с файлом app.exe.config, он должен выглядеть следующим образом:

          

    И немного тестирования, что он по-прежнему работает правильно, Microsoft использовала v4.0 для исправления нескольких старых ошибок в версии 2.0, которые невозможно было легко устранить, не рискуя сломать старый код, основанный на ошибочном поведении.

     Add true to the reference 

    В большом решении со многими проектами, ссылающимися друг на друга, это может иметь каскадный эффект, который является болью для исправления вручную. Чтобы автоматизировать процесс, я написал сценарий PowerShell ниже. Запустите его на верхнем уровне вашего решения – скрипт ищет рекурсивно для файлов .csproj и обновляет элементы ProjectReference соответствующие частичным GUID (которые вы должны указать, отредактировав соответствующую строку скрипта) .

     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") 

    Перейдите в Visual Studio 2015

    1. Во-первых, выполните щелчок правой кнопкой мыши по вашему проекту
    2. Выберите Свойства проекта
    3. Выберите вкладку «Приложение» (вкладка «По умолчанию»)
    4. Измените целевую структуру на желаемые frameworks для этого конкретного проекта. Изображение для этого процесса показано здесь
    Давайте будем гением компьютера.