Reorientación de todos los proyectos de una solución a .NET 4.5.2

96

Tengo una solución en Visual Studio 2012 con 170 proyectos de C #. Necesito reorientar todos los proyectos de .NET Framework 4.0 a 4.5.2.

Prefiero dejar que Visual Studio maneje esto yendo a las propiedades de cada proyecto, cambiando el marco de trabajo de destino y dejando que Visual Studio realice los cambios necesarios en los archivos .csproj.

Noté que estos cambios incluyen agregar algunas etiquetas XML nuevas al .csproj, dependiendo de algunos atributos del proyecto actual.

¿Cómo puedo reorientar por lotes todos los 170 proyectos de C # sin solo usar una herramienta de reemplazo de texto para reemplazar el número de versión de destino? Quiero que Visual Studio realice todas las modificaciones y adiciones de etiquetas necesarias y el reemplazo solo no permitirá que eso suceda.

Kyle V.
fuente
No conozco ninguna forma de hacer esto automáticamente ... Creo que su mejor opción sería una grabadora de macros de Windows estándar, que usa comandos de teclado ... Pero, los ejecutaría uno a la vez en lugar de intentar agruparlos juntos, ya que puede ser difícil identificar cuándo VS ha terminado con su trabajo en todos los casos.
Erik Funkenbusch
1
No, no deberías estar haciendo esto. Especialmente no 4.5.2, no tiene nuevos tipos útiles y es poco probable que sea cubierto por futuros paquetes de objetivos múltiples. Al igual que 4.0x no lo fue. Haga este proyecto un proyecto a la vez y solo los que lo necesiten. Aquellos en los que realmente desea agregar un nuevo ensamblado de referencia y modificar el código para usarlos. Si desea ignorar este consejo, probablemente lo haga, luego use Editar> Buscar y reemplazar> Reemplazar en archivos para reemplazar el elemento TargetFrameworkVersion en los archivos * .csproj. Asegúrese de que su control de fuente sea sólido.
Hans Passant
1
@HansPassant Su solución de Buscar / Reemplazar es exactamente lo que no quería hacer de acuerdo con mi pregunta. Necesito una solución más sólida.
Kyle V.
@GrantWinney Yo / sé / no funcionará porque ya probé Buscar / Reemplazar y si usa ese método, los cambios adicionales de .csproj que Visual Studio habría hecho de otra manera no se implementan.
Kyle V.
1
@GrantWinney, la extensión de Target Framework Migrator hace exactamente lo que yo quería. Si puede crear una respuesta, la marcaré como correcta. ¡Gracias!
Kyle V.

Respuestas:

84

La documentación de MSDN " Guía de migración a .NET Framework 4.5 " y " Cómo configurar una aplicación para admitir .NET Framework 4 o 4.5 " solo trata sobre la modificación de proyectos. No hay detalles sobre la aplicación de cambios a toda la solución a la vez, ni he visto una función en VS que la admita.

Sin embargo, hay una extensión (bien calificada) llamada Target Framework Migrator disponible en la galería de Visual Studio, que admite la actualización a 4.5.2 (así como a versiones más nuevas **) y parece que hará exactamente lo que desea. El código fuente está disponible en GitHub , si está interesado.

Tenga en cuenta que la falta de dicha característica puede ser intencional (y no solo una omisión). Solo supongo, pero tal vez MS cree que solo se actualizarán los proyectos que necesitan los nuevos Frameworks. FWIW, si termina actualizando algunos proyectos que se comparten con otras soluciones, es posible que esas soluciones no se desarrollen hasta que también se actualicen.

Dicho esto, si está en una tienda pequeña con solo una (o algunas) soluciones y está buscando actualizar todo de una vez, entonces tal vez la herramienta anterior funcione para usted.


No ha habido ningún desarrollo en esto durante años , y aparentemente el desarrollador no tiene planes de pasar el testigo a nadie más.

Si no puede hacer que funcione con una versión más reciente de .NET Framework, consulte los PR y los problemas existentes para ver si hay correcciones, pero es posible que deba aplicarlas usted mismo. Por ejemplo, alguien publicó una solución para .NET Framework v 4.7.1 . Con suerte, estos se fusionarán, pero no aguantaré la respiración.

Si alguien más ve el mismo error que Anas (en los comentarios), aquí hay un problema de GitHub de hace un par de semanas y otro problema posiblemente relacionado de 2017. Considere aprobarlos y agregar más detalles si tiene el mismo problema .

vivat piscis
fuente
7
La herramienta "migrador de marco de destino" está fallando en la última actualización de VS 2017 15.5.5, "Parámetro no válido"
Anas Ghanem
1
Trabajó para mí hoy con VS2017 15.7 a Framework 4.7
Tod
Dudo mucho que MS omita intencionalmente funciones para que los usuarios se beneficien ... es mucho más probable que sea algo más en lo que no pensaron o no tienen que apoyar ... páselo a la comunidad ..
PJUK
1
@Grant Agregué un comentario al problema existente. De hecho, hice el trabajo con una búsqueda de búsqueda / sed y reemplazo en el proyecto y los archivos de configuración.
JB. Con Monica.
2
El desarrollador pasó el testigo en diciembre de 2019, puede editar su (buena) respuesta nuevamente :)
Ludovic Feltz
12

Para una solución .NET Framework, un simple " Reemplazar en archivos " me sirvió:

por ejemplo : de .NET Framework 4.5.2 a .NET Framework 4.7.2

En los archivos package.config , reemplace todos

targetFramework="net452" 

a

targetFramework="net472" 

En archivos * .csproj , reemplace todos

<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 

a

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
webpat
fuente
1
En VS 2019, "reemplazar todo" no funciona del todo. Tienes que usar repetidamente "buscar siguiente". Este es mi último proyecto de desarrollo basado en Microsoft. Voy a pasar a MacOSX, donde hay consistencia y un nivel decente de control de calidad realizado en sus productos.
ATL_DEV
1
Cambiar el targetFramework en packages.config no reinstala el paquete para ese marco, por lo que aún podría terminar con la versión incorrecta. Tendría que reinstalar el paquete, o al menos eliminar su carpeta de paquetes y restaurar la versión correcta del paquete. El problema es con ese antiguo modelo packages.config, sin reinstalar, sus referencias de dll para el paquete se dirigirán a la dll incorrecta en el subdirectorio incorrecto del paquete.
Triynko
3
Vaya, terminé de nuevo en esta pregunta nuevamente después de las vacaciones y también vi la necesidad de comentar sobre esta misma respuesta, jaja. Agregaré que los archivos * .csproj y packages.config no son las únicas cosas que hacen referencia al marco de destino. También hay referencias en los archivos web.config en varias secciones. Por ejemplo, en system.web, las etiquetas de compilación y httpRuntime tienen un atributo targetFramework que debería actualizarse. Por lo tanto, este proceso manual de 'buscar y reemplazar' parece una idea realmente terrible que podría dejar sus proyectos en un estado inconsistente y corrupto.
Triynko
9

Dado que Target Framework Migrator está roto, hice mi propia búsqueda / reemplazo (usando git bash, funciona bien en Windows); Básicamente se cambia el v4.6.x en v4.7.2 , entonces se convierte de nuevo a los archivos usando CRLF de la infame DOS:

find . \( -iname '*.csproj' -o -iname '*.vcxproj' -o -iname 'app.config' \) \
 -exec grep -Z -l 'v4\.6\..' \{} \; | xargs -0 sed -i 's/v4\.6\../v4.7.2/'  
find . \( -iname '*.csproj' -o -iname '*.vcxproj' -o -iname 'app.config' \) \
 -exec grep -Z -l 'v4\.7\..' \{} \; | xargs -0 unix2dos
JB. Con Monica.
fuente
4
Encontré esto, y luego Update-Package -ReInstallhice maravillas. ¡Gracias!
askrich
1
Esto funcionó perfectamente bien para mí. Gracias por esta solución
Maryam
Para obtener una versión de
PowerShell,
7

He creado una herramienta simple para migrar las versiones del marco de destino para una solución completa, porque Target Framework Migrator Extension no es compatible con Visual Studio 2017. Descargue la herramienta de mi repositorio de GitHub https://github.com/Xpitfire/TargetFrameworkMigrator

Sé que esta no es la mejor manera de hacerlo, pero funcionó para mí y tal vez también ayude a alguien más.

Marius-Constantin Dinu
fuente
Seguro que lo hace ahora.
Jay Croghan
3

Target Framework Migrator es bastante útil. De forma predeterminada, llega a la v4.7. Sin embargo, es fácil agregar soporte para v4.7.1, v4.7.2 y v4.8.

Busque el archivo Frameworks.xml en la carpeta C: \ Users {username} \ AppData \ Local \ Microsoft \ VisualStudio \ y edítelo agregando estas versiones de framework:

<Framework Id="262152" Name=".NETFramework,Version=v4.8"/>
<Framework Id="262663" Name=".NETFramework,Version=v4.7.2"/>
<Framework Id="262407" Name=".NETFramework,Version=v4.7.1"/>

Después de reiniciar Visual Studio, verá nuevas versiones.

Doğa Benli
fuente
3
Hay una bifurcación con una versión compatible con VS2019 que ya está actualizada en github.com/Ian1971/TargetFrameworkMigrator/releases
ScottS
¡Muchas gracias! ¡Esta fue una solución muy agradable y fácil!
fusión
2
public void ChangeFramework() {

  //Add Reference to envdte (Assemblies\Extensions\envDTE)
  string SolutionFile = @"C:\MyProject\MyProject.sln";
  string ProjectName = "MyProject";

  //------------------------------------------------------------------------
  //Find the Program ID from the registry for VisualStudio.DTE
  //Look it up In Registry: Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes
  System.Type oType = System.Type.GetTypeFromProgID("VisualStudio.DTE", true);
  EnvDTE.DTE dte = (EnvDTE.DTE)Activator.CreateInstance(oType, true);

  //------------------------------------------------------------------------
  //Open your Solution
  dte.Solution.Open(SolutionFile);

  //------------------------------------------------------------------------
  //Now In your solution go through what is listed in dte.Solution.Projects 
  //and find the one that match what you want to change target for
  int iItemsCount = dte.Solution.Projects.Count;
  string sCurrent = "";

  for (int i = 1; i <= iItemsCount; i++) {

    sCurrent = dte.Solution.Projects.Item(i).Name;

    if (dte.Solution.Projects.Item(i).Name == ProjectName) {
      //Once you find your project, Change the Framework
      EnvDTE.Project oProject = dte.Solution.Projects.Item(i);
      oProject.Properties.Item("TargetFrameworkMoniker").Value = ".NETFramework,Version = v4.6.2";
    }
  }

  //------------------------------------------------------------------------
  //Close your Solution
  dte.Solution.Close();
}
MaxR
fuente