Подтвердить что ты не робот

Visual Studio 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. Профиль клиента 4 Framework или .NET. Framework 4. Чтобы устранить ошибку, убедитесь, что профиль, на который ваше приложение совместимо с профиль, ориентированный на проекты или сборки, на которые ссылаются ваши приложение.

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

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

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

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

4b9b3361

Ответ 1

Шаг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

Ответ 2

Нумерация версий .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, формат был изменен. Единственным обходным решением является force EXE для загрузки версии 4.0 CLR, хотя она запрашивает 2.0.50727. Вы делаете это с файлом app.exe.config, он должен выглядеть следующим образом:

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

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

Ответ 3

Add <SpecificVersion>true</SpecificVersion> to the reference

В большом решении со многими проектами, ссылающимися друг на друга, это может иметь каскадный эффект, который является болью для исправления вручную. Чтобы автоматизировать процесс, я написал PowerShell script ниже. Запустите его на верхнем уровне вашего решения - script рекурсивно ищет файлы .csproj и обновляет элементы ProjectReference, соответствующие частичным GUID (которые вы должны указать, отредактировав соответствующую строку 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")

Ответ 4

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

  • Во-первых, выполните щелчок правой кнопкой мыши по вашему проекту
  • Выберите Свойства проекта
  • Выберите вкладку "Приложение" (вкладка "По умолчанию" )
  • Измените целевую структуру на желаемую структуру для этого конкретный проект. Изображение для этого процесса показано здесь