2012-01-03 9 views
6

Resumen:Cuándo usar <ProjectReference> en archivos de proyecto?

proyectos de la estructura con el fin de malo en Visual Studio y logró C++ y C# proyectos

Descripción:

Tengo una (más de 100 proyectos) archivo de solución masiva que se está construyendo algunos proyectos en el orden incorrecto El archivo de solución contiene los siguientes tipos de proyectos:

  • nativo de C/C++
  • de C++
  • de C#

La solución contiene todas las dependencias apropiadas entre los diferentes tipos de proyectos. Ok, entonces cuando construyo desde la línea de comando (usando MSBuild), hay un problema. Las dependencias para los proyectos administrados (tanto C++ como C#) se crean en el orden incorrecto. Por ejemplo, un proyecto no se compilará porque falta una dependencia gestionada. Por ejemplo, un archivo gestionado C++ tendrá un uso declaración de que se producirá un error:

#using <foo.dll> 

desde foo.dll no existe todavía.

Lo que significa que foo.dll debería haber sido construido antes, pero no lo era. Como mencioné anteriormente, las dependencias están configuradas correctamente en el archivo de solución. Por ejemplo, si foo depende de Baz, tengo esto en el archivo de solución ...

Project("{C4ABA494-43D0-400A-9917-20E167A12CFD}") = "Foo", "...\Foo.vcxproj", "{5A42640E-9E0A-442B-8A40-AA91AD5444AC}" 
    ProjectSection(ProjectDependencies) = postProject 
     ... 
     {2CE32AE0-B129-40BA-B06E-A628FA149AB3} = {2CE32AE0-B129-40BA-B06E-A628FA149AB3} 
    EndProjectSection 
EndProject 
... 
Project("{C4ABA494-43D0-400A-9917-20E167A12CFD}") = "baz", "...\baz.csproj", "{2CE32AE0-B129-40BA-B06E-A628FA149AB3}" 
    ProjectSection(ProjectDependencies) = postProject 
     ... 
    EndProjectSection 
EndProject 

Así que el archivo de solución tiene correctamente la dependencia. Pero la dependencia en el proyecto Foo.vcxproj solo se expresa mediante la directiva #using. He leído en el blog de Visual Studio que hay un error conocido al ordenar proyectos en msbuild. http://blogs.msdn.com/b/visualstudio/archive/2010/12/21/incorrect-solution-build-ordering-when-using-msbuild-exe.aspx

Su solución es añadir un elemento llamado a mis proyectos, como este:

<ProjectReference Include="... foo.csproj"> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
</ProjectReference> 

De todas formas, mi pregunta es: necesito para hacer esto sólo para mis proyectos de C++? ¿O lo hago para proyectos Managed C++ AND C#? (Creo que no necesito hacer esto para proyectos de C# ya que sus dependencias son explícitas)

Nota: He intentado poner esto en TODOS los proyectos de mi compilación, y no funcionó tan bien, como obtuve muchos errores de compilación extraños en mis proyectos nativos ...

Gracias por cualquier respuesta a esto.

Respuesta

4

Tuve el mismo problema, pero solo con proyectos de C#. Parece que MsBuild NO está usando dependencias de archivos de soluciones. Está utilizando referencias de proyectos dentro de los archivos del proyecto para crear una orden de compilación. Intenta actualizar todas tus referencias de proyecto para obtener el orden de compilación correcto. En su caso, debe agregar referencia de proyecto administrado (dependencia) en su archivo de proyecto C++.

La respuesta a su pregunta es: Sí, debe hacerlo para los proyectos de C++ AND C# administrados.Establecer dependencias dentro de un archivo sln no es suficiente si está compilando con MSBuild.

+0

Descubrí que si agrego un elemento ProjectReference para vincular a una biblioteca nativa, creo errores en el interior de los scripts de MSBuild. Así que he comenzado añadiendo ProjectReference, a otros archivos .csproj, para todos mis proyectos de C++ administrados. Ahora los agregaré a mis archivos .csproj y veré cómo funcionan. –

Cuestiones relacionadas