Visual Studio 2010: Ensamblados De Referencia Dirigidos A Una Versión Superior del Marco


Visual Studio 2008 le permitió hacer referencia a un ensamblado A desde un Ensamblado B cuando A tenía como objetivo.NET 3.5 y B tenía como objetivo. NET 2.0.

Visual Studio 2010 ya no permite esto. El número completo se describe en MSDN :

Puede crear aplicaciones que proyectos o asambleas de referencia que apunta a diferentes versiones de. NET Marco. Por ejemplo, si crea una aplicación que se dirige a. NET Cliente de Framework 4 Perfil, que proyecto puede hacer referencia a un ensamblaje que se dirige a. NET Framework versión 2.0. Sin embargo, si crea un proyecto que se dirige a una versión anterior de. NET Framework, no se puede establecer un referencia en ese proyecto a un proyecto o ensamblado que apunta al. NET Perfil de cliente de Framework 4 o. NET Framework 4 . Para eliminar el error, asegúrese de que el perfil objetivo por su aplicación es compatible con perfil de los proyectos o asambleas referenciadas por su aplicación.

¿Hay alguna forma en que pueda hacer que VS2010 se comporte como VS2008 en este sentido (es decir, permitir referencias a ensamblados dirigidos a versiones superiores del framework)?

Conozco el razonamiento detrás del comportamiento VS 2010 y las consideraciones de implementación que necesito tener en cuenta, no es necesario repetir eso.

El error exacto es:

Advertencia MSB3268: La referencia primaria "xxx.dll" no se pudo resolver porque ha un dependencia indirecta de la sistema de montaje de marcos".Núcleo, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 " que no se pudo resolver en la actualidad marco específico. ".NetFramework, Version = v2.0". A resolver este problema, ya sea eliminar referencia "xxx.dll" o reorientar su aplicación a un versión del marco que contiene "Sistema.Core, Version = 3.5.0.0, Cultura = neutral, PublicKeyToken = b77a5c561934e089".

Author: Johannes Rudolph, 2010-07-21

4 answers

Paso 1: Descargue el proyecto de referencia targeting. NET 2.0

Paso2: Haga clic derecho en el proyecto descargado y seleccione editar desde el menú contextual

Paso 3: Añadir <SpecificVersion>true</SpecificVersion> a la referencia. A continuación se muestra una muestra de mi solución repro:

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

Paso 4: Recargar el proyecto.

Ahora debería poder compilar dentro de Visual Studio 2010, todavía podría haber una advertencia como la siguiente, pero la compilación puede ser exitosa.

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

 44
Author: Johannes Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-21 11:46:28

La numeración de la versión de.NET Framework tiene que ser un desastre después de la versión 2.0. Un ensamblado no se dirige a una versión de.NET framework, sino a una versión de CLR. Y la versión de CLR para las versiones de framework 2.0, 3.0 y 3.5 fue la misma, 2.0.50727.

Es por eso que parecía como si pudieras mezclar versiones en VS2008. Pero estaban viendo la [AssemblyVersion] de un ensamblado, que no tiene nada que ver con la versión CLR. Desafortunadamente, la versión CLR no es visible en el Ventana de propiedades, tendrías que ejecutar Ildasm.exe para verlo en los metadatos. Pero puede asumir con seguridad que cualquier versión de ensamblado entre 2.0.0.0 y 3.5.0.0 apunta a la versión 2.0.50727

Que terminó con.NET 4.0, obtuvo una nueva versión de CLR, 4.0.30319. Lo que el blurb de MSDN le está diciendo que cuando se dirige a la versión 2.0 de CLR, entonces no puede usar ensamblados que se dirigen a la versión 4.0. La versión 2.0 CLR no sabe leer los metadatos de un ensamblado. NET 4.0, el formato fue cambiado. El único la solución es forzar el EXE para cargar la versión 4.0 del CLR, a pesar de que pide 2.0.50727. Lo haces con una aplicación.exe.archivo de configuración, debería tener este aspecto:

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

Y un poco de prueba de que todavía funciona correctamente, Microsoft utilizó v4.0 para corregir varios errores antiguos en 2.0 que no se podían arreglar fácilmente sin correr el riesgo de romper el código antiguo que se basaba en el comportamiento de errores.

 20
Author: Hans Passant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-26 22:23:15
Add <SpecificVersion>true</SpecificVersion> to the reference

En una solución grande con muchos proyectos haciendo referencia entre sí, esto podría tener un efecto en cascada, que es un dolor de arreglar manualmente. Para automatizar el proceso, escribí el script de PowerShell a continuación. Ejecútelo en el nivel superior de su solución the el script busca recursivamente archivos .csproj y actualiza los elementos ProjectReference que coinciden con los GUID parciales (que debe especificar editando la línea relevante del 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
Author: Justin M. Keyes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-18 22:12:18

Por favor, vaya a Visual Studio 2015

  1. Primero, proceda con el clic derecho en su proyecto
  2. Seleccione las propiedades del proyecto
  3. Seleccione la pestaña Aplicación(pestaña predeterminada)
  4. Cambiar el Marco Objetivo al marco deseado para eso proyecto específico. La imagen para este proceso se muestra aquí
 1
Author: Ashish Pandey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-11 17:16:04