Pregunta

Me encontré con una situación extraña con MSBuild en este momento. Hay una solución que tiene tres proyectos: LibX, LibY y Exe. Exe hace referencia a libx. LibX, a su vez, hace referencia a LibY, tiene algunos archivos de contenido y también referencias a una biblioteca de terceros (varios ensamblajes pre-construidos instalados tanto en la carpeta GAC ??como en la carpeta lib local). La biblioteca de terceros está marcada como " Copiar local " (" privado ") y aparece en la salida del proyecto LibX, como lo hacen la salida de LibY y los archivos de contenido de LibX. Ahora, la salida del proyecto Exe tiene la salida del proyecto LibX, los archivos de contenido del proyecto LibX, la salida del proyecto LibY (proveniente de LibX), pero SIN ensamblajes de bibliotecas de terceros.

Ahora resolví esto haciendo referencia a la biblioteca de terceros directamente en el proyecto Exe, pero no creo que esto sea un " correcto " solución.

¿Alguien ha tenido este problema antes?

¿Fue útil?

Solución

Sí, también he tenido ese problema. Aunque me encantaría decir lo contrario, creo que debe incluir todas las dependencias transitivas como referencias en su archivo de compilación.

Otros consejos

Hay una diferencia en el comportamiento al compilar con MSBuild (es decir, la línea de comandos, la compilación TFS y otras herramientas) en comparación con la compilación con Visual Studio. Las referencias secundarias no se incluyen en la variable de referencias enviadas a las tareas de compilación de MSBuild.

MSBuild proporciona varios puntos de extensión para cambiar la forma en que se deben resolver las referencias. He utilizado con éxito AfterResolveReference para solucionar este problema en algunos de mis proyectos, He publicado más información sobre el fondo en mi blog .

La solución es agregar el siguiente código en tus archivos vbproj o csproj

  <Target Name="AfterResolveReferences">
    <!-- Redefine referencepath to add dependencyies-->
    <ItemGroup>
     <ReferencePath Include="@(ReferenceDependencyPaths)">
     </ReferencePath>
    </ItemGroup> 
  </Target>

Microsoft ha declarado que esto no se soluciona en Conectar

En realidad, puede ir al archivo Microsoft.CSharp.targets o Microsoft.VisualBasic.targets (ubicado en el directorio del marco, generalmente C: \ Windows \ Microsoft.NET \ Framework \ v3.5) y modificar el csc o vbc Parámetros de tareas para incluir dependencias de referencia adicionales. En el archivo (objetivos VB, línea 166; objetivos C #, línea 164) cambiar: \

References="@(ReferencePath)"

a

References="@(ReferencePath);@(ReferenceDependencyPaths)"

Esto podría causar otros problemas dependiendo de cuán complicadas sean las cosas y puede jugar trucos con el compilador inproc de Visual Studio, pero es la única forma de hacerlo en MSBuild que he encontrado.

la respuesta de josant casi me funcionó; Seguí recibiendo un error en Visual Studio cuando intenté eso:

Se produjo un problema al intentar configurar " Referencias " Parámetro para el compilador en proceso del IDE. El error HRESULT E_FAIL se ha devuelto desde una llamada a un componente COM

La solución a mi problema fue poner una condición en el ItemGroup, como esto:

<Target Name="AfterResolveReferences">
  <!-- Redefine referencepath to add dependencies-->
  <ItemGroup Condition=" '$(BuildingInsideVisualStudio)' != 'true' ">
    <ReferencePath Include="@(ReferenceDependencyPaths)"></ReferencePath>
  </ItemGroup>
</Target>

Eso provocó que Visual Studio ignorara completamente el cambio de referencia, y la compilación funciona bien localmente y en el servidor de compilación.

El método AfterResolveReferences falla si tienes un gráfico dirigido, no un árbol con un " intentando implementar diferentes copias de la dll " error. (consulte Cómo configurar msbuild / MSVC para implementar archivos dependientes de conjuntos dependientes )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top