La tarea TransformXml no se pudo cargar desde Microsoft.Web.Publishing.Tasks.dll

95

¿Alguien ha visto este error y sabe cómo solucionarlo?

La tarea "TransformXml" no se pudo cargar desde el ensamblado C: \ Archivos de programa (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.Tasks.dll.

No se pudo cargar el archivo o ensamblado 'archivo: /// C: \ Archivos de programa (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.Tasks.dll' o una de sus dependencias. El sistema no puede encontrar el archivo especificado.

Confirme que la declaración sea correcta, que el ensamblado y todas sus dependencias estén disponibles y que la tarea contenga una clase pública que implemente Microsoft.Build.Framework.ITask.

Leí en otra parte que el problema es cuando no tienes instalado SQL Server. Pero tengo SQL Express 2012 x64 instalado con SP1. También estoy ejecutando VS 2013 Professional.

He ejecutado exactamente esta misma solución en VS 2012 express sin problemas.

allencoded
fuente
1
Este debería ser un paquete nuget. No me gustan estas referencias ocultas dentro de mi proyecto.
Jaider
Debe marcar la respuesta de Benjamin Scheibe como la correcta. Parece ser la mejor solución
BHuelse

Respuestas:

163

Las respuestas proporcionadas por Dai Bok y emalamisura funcionan bien siempre que use Visual Studio 2012. Para VS 2013, esto también falla. Para que esto funcione con todas las versiones de Visual Studio, debe:

  • Abra el archivo de proyecto (.csproj) del proyecto que no se carga
  • Buscar <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets" />
  • Cámbielo a <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />
  • Recargar el proyecto

Eso establecerá la versión correcta de Visual Studio de forma dinámica y adecuada.

Ben Sch
fuente
2
Me gusta su solución, Benjamin, pero el problema que tenía era que faltaba la carpeta v11, posiblemente porque tenemos algunas personas que usan vs2010 y aún no hemos actualizado a vs2012
Dai Bok
7
Esto me ayudó a comenzar por el camino correcto, pero el cambio que hice fue en el nodo <UsingTask TaskName = "TransformXml" ...>. Mi AssemblyFile estaba usando la versión incorrecta. Solo necesitaba cambiar la versión aquí. Otra opción sería utilizar una macro de versión en lugar de establecer explícitamente la versión.
Scott
5
$(VisualStudioVersion)está devolviendo una versión anterior :(
Jaider
1
Esto puede ser un parámetro: stackoverflow.com/questions/20002532/…
Jaider
2
Funciona perfectamente mientras se actualiza de VS2015 a VS2017. Ahora puedo abrir la solución en ambos IDE.
Yury Schkatula
29

Para que la mía funcione, simplemente copié mi v10.0carpeta y le cambié el nombre a v11.0, y las cosas parecen funcionar bien a partir de ese momento. Esa es la solución rápida por ahora.

Como esta probablemente no sea la mejor solución, y aunque funciona, iba a intentar instalar el SDK de Microsoft Windows para Windows 7 y .NET Framework 4 Windows SDK para Windows 7 y .NET Framework 4, pero está tardando mucho en descargar.

Dai Bok
fuente
1
No vi la carpeta 'Web' en v10.0. Así que lo copié de la carpeta v12.0 a la carpeta v11.0.
Domingo
9

He estado combatiendo este problema en nuestro servidor de compilación durante varios días, así que pensé que documentaría la resolución a la que llegué. Primero, mi servidor de compilación tiene instaladas las extensiones de publicación web . Puedo usar la tarea TransformXml al contenido de mi corazón dentro de un proyecto de aplicación web.

Para usarlo fuera de un proyecto de aplicación web, intenté agregar el elemento UsingTask a mi proyecto y apuntarlo al lugar correcto usando las propiedades de compilación de ms (como demostró Benjamin). Sin embargo, no estaban en mi servidor de compilación (aquellos con fácil acceso al sistema de archivos de su servidor de compilación probablemente puedan omitir esto y simplemente instalar el paquete relevante en Visual Studio). Incluso fui tan lejos como para codificar versiones de Visual Studio, pero siempre me dejaba caer ese error.

Finalmente me di por vencido, saqué las DLL de mi PC local:

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.Tasks.dll
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.XmlTransform.dll

Los subí al control de código fuente y agregué esa carpeta al espacio de trabajo de mi compilación (Editar definición de compilación -> Configuración de origen -> Carpeta de control de código fuente). A partir de ahí, ni siquiera necesito hacer referencia a la carpeta; así es como se ve mi UsingTask:

  <UsingTask TaskName="TransformXml" AssemblyFile="Microsoft.Web.Publishing.Tasks.dll" />

Ahora puedo usar la tarea TransformXml al contenido de mi corazón desde cualquier proyecto.

bvoyelr
fuente
9
El paquete MSBuild.Microsoft.VisualStudio.Web.targets tiene los destinos necesarios para compilar sin VS instalado. Por ejemplo: <UsingTask TaskName = "TransformXml" AssemblyFile = "packages \ MSBuild.Microsoft.VisualStudio.Web.targets.11.0.2.1 \ tools \ VSToolsPath \ Web \ Microsoft.Web.Publishing.Tasks.dll" />. Vea este blog para más detalles
moonpatrol
1
Hola @moonpatrol, deberías convertirlo en una respuesta, porque prefiero esta forma: instalar el paquete y luego referirlo, una solución absolutamente universal :-) Acabo de probarlo y funciona perfectamente. ¡Gracias de todos modos! si lo hace una respuesta, solo envíeme un ping y votaré.
Tengiz
9

Para solucionar el problema,

  1. Encuentre el instalador de Visual Studio en su computadora
  2. Haga clic o toque para iniciar el instalador y luego seleccione Modificar.
  3. En la pantalla Componentes individuales, seleccione Asp.net y herramientas de desarrollo web y luego seleccione Modificar / Instalar.

Esto resolvió el problema, ya que crea los dll en la ruta mencionada.

Vinodhini Ramasamy
fuente
2
Estoy usando VS2017 y realizar este paso no crea esos archivos. Creo que quizás algo más que seleccionó (o en combinación con ASP.net y herramientas de desarrollo web) que lo agregó. Sin embargo, no estoy seguro de qué :(
Kris
He seleccionado solo eso. Intente seleccionar componentes relacionados con la Web e instálelos. Pero buena suerte.
Vinodhini Ramasamy
Intenté todo el flujo de trabajo web y todavía no tengo esos archivos. Siento que esta solución está tan cerca. Ojalá pudiera ser puntualizado ya que tengo espacio limitado en mi HDD para instalar componentes
Robert Snyder
4
Para VS2017, lo hice Tools → Get Tools and Features... → Individual Components: Windows 10 SDK (10.0.14393.0) and ASP.NET and web development tools . Esto parece haber funcionado.
John Jones
5

Debido a que solo hay v12.0, v14.0 y v15.0 en mi carpeta de VisualStudio, edito el archivo de mi proyecto y cambio la ruta de referencia de v10.0 a v14.0. Entonces el proyecto se construye con éxito.

Antes de:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />

Después:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
Espada
fuente
5

Para VS2019

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(MSBuildToolsVersion

Reemplacé MSBuildToolsVersioncon VisualStudioVersion.

vik_78
fuente
Con este documento " docs.microsoft.com/visualstudio/msbuild/… " cambie MSBuildToolsVersion con VisualStudioVersion y luego cambio esa propiedad que funciona bien así " $ (MSBuildExtensionsPath32) \ Microsoft \ VisualStudio \ v $ (VisualStudioVersion) "
Kim Ki Won
2

La respuesta correcta a esto es descargar el proyecto en cuestión y luego editar el archivo csproj, buscar una entrada en la que estén haciendo referencia a la ruta 10.0 y cambiarla para que apunte a 11.0 en su lugar.

emalamisura
fuente
+1 por eso. Cause este problema cuando copié las carpetas de mi espacio de trabajo de una máquina de desarrollo a otra. La segunda máquina de desarrollo tenía instalada la versión 11, no la 10. Por lo tanto, la carpeta v10 estaba vacía.
maplemale
1

Necesita dos cosas para que funcione:

1) Instale Visual Studio Build Tools (no necesita todo Visual Studio, solo VS Build Tools) con la opción seleccionada "Herramientas de construcción de desarrollo web" en su servidor de compilación https://www.visualstudio.com/pl/thank -you-downloading-visual-studio /? sku = BuildTools & rel = 15

2) Asegúrese de que la ruta a Microsoft.Web.Publishing.Tasks.dll sea correcta

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(MSBuildToolsVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
cezarypiatek
fuente
1

Para mí, comenzó a funcionar simplemente agregando una referencia al paquete NuGet MSBuild.Microsoft.VisualStudio.Web.targets v14.0.0.3

Incluso no es necesario agregar el elemento UsingTask al archivo del proyecto como lo menciona el autor del paquete

https://github.com/pdonald/nuget-webtargets

Simplemente instale el paquete NuGet. El paquete establece automáticamente la propiedad $ (VSToolsPath) para usar el archivo de destino en la carpeta de herramientas.

Y luego pude usar TransformXml y otras tareas, definidas en el paquete, por ejemplo, para transformar app.config

  <Target Name="app_config_AfterCompile" AfterTargets="AfterCompile" Condition="Exists('app.$(Configuration).config')">
    <!--Generate transformed app config in the intermediate directory-->
    <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
    <!--Force build process to use the transformed configuration file from now on.-->
    <ItemGroup>
      <AppConfigWithTargetPath Remove="App.config" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>
Cuenta
fuente
0

En caso de que alguien esté usando un csproj estilo SDK, puede lograrlo sin tener que instalar Visual Studio en el servidor de compilación.

  1. Primero debe instalar el paquete nuget SlowCheetah en su proyecto. Una vez que lo instale, verá lo siguiente en su proyecto de estilo SDK.

    <PackageReference Include="Microsoft.VisualStudio.SlowCheetah" Version="3.2.20">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    
  2. Luego, asegúrese de agregar el atributo GeneratePathProperty = "true" (ver más abajo). Esto es muy importante para la siguiente parte porque lo ayudará a tomar la ruta de dónde se restaura el paquete nuget en su máquina. George Dangl lo explica en su artículo aquí .

    <PackageReference Include="Microsoft.VisualStudio.SlowCheetah" Version="3.2.20" GeneratePathProperty="true">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    
  3. Importe los objetivos de SlowCheetah a su proyecto:

    <Import Project="$(PkgMicrosoft_VisualStudio_SlowCheetah)\build\Microsoft.VisualStudio.SlowCheetah.targets" />
    
  4. Ahora puede usar un comando de destino (en este caso después de la publicación) para aplicar algunas transformaciones personalizadas. Si es necesario, siempre puede codificar los nombres de archivo a continuación en lugar de usar las variables en el siguiente ejemplo.

    <Target Name="AfterPublishs" AfterTargets="Publish">
         <TransformTask Source="Web.config" Transform="Web.$(Configuration).MyCustomTransformFile.config" Destination="$(PublishDir)\Web.config" />
    </Target>
    

Si no ha usado SlowCheetah antes, le recomiendo que lo revise. Tienen una extensión de Visual Studio que le facilitará la vista previa de los archivos de transformación.

Eric Chhun
fuente