Visual Studio 2010: справочные сборки, ориентированные на более высокую версию платформы - PullRequest
35 голосов
/ 21 июля 2010

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

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

Вы можете создавать приложения, которые эталонные проекты или сборки, которые ориентироваться на разные версии .NET Фреймворк. Например, если вы создаете приложение, предназначенное для .NET Framework 4 Client Profile, который Проект может ссылаться на сборку, которая предназначается для .NET Framework версии 2.0. Тем не менее, если вы создаете проект, который предназначается для более ранней версии .NET Framework, вы не можете установить ссылка в этом проекте на проект или сборка, нацеленная на .NET Framework 4 Профиль клиента или .NET Рамки 4 . Чтобы устранить ошибку, убедитесь, что целевой профиль ваше приложение совместимо с профиль, на который нацелены проекты или сборки, на которые ссылается ваш применение.

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

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

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

предупреждение MSB3268: основная ссылка "Xxx.dll" не может быть решена, потому что это имеет косвенная зависимость от каркас сборки "System.Core, Версия = 3.5.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089 "который не может быть решена в настоящее время целевые рамки. ».NETFramework, Version = v2.0" . к решить эту проблему, либо удалить ссылка "Xxx.dll" или перенаправьте ваше приложение на рамочная версия, которая содержит "System.Core, версия = 3.5.0.0, Culture = нейтрально, PublicKeyToken = b77a5c561934e089" .

Ответы [ 4 ]

44 голосов
/ 21 июля 2010

Шаг 1: выгрузить ссылочный проект с таргетингом на .NET 2.0

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

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

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

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

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

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

21 голосов
/ 21 июля 2010

Нумерация версий .NET Framework должна быть беспорядочной после 2.0.Сборка не предназначена для версии платформы .NET, она предназначена для версии 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, он должен выглядеть следующим образом:

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

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

6 голосов
/ 19 июля 2011
Add <SpecificVersion>true</SpecificVersion> 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) {
                # <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")
1 голос
/ 11 апреля 2017

Пожалуйста, перейдите в Visual Studio 2015

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