2012-01-03 13 views
6

Sommario:Quando utilizzare <ProjectReference> nei file di progetto?

Progetti costruire in modo sbagliato con Visual Studio e gestito C++ e C progetti #

Descrizione:

Ho un enorme (oltre 100 progetti) file di soluzione che sta costruendo alcuni progetti nell'ordine sbagliato. Il file di soluzione contiene i seguenti tipi di progetti:

  • nativo C/C++
  • Managed C++
  • Managed C#

La soluzione contiene tutte le dipendenze corrette tra i diversi tipi di progetti. Ok, quindi quando costruisco dalla riga di comando (usando MSBuild), c'è un problema. Le dipendenze per i progetti gestiti (sia C++ che C#) vengono create nell'ordine sbagliato. Ad esempio un progetto non riuscirà a costruire perché manca una dipendenza gestita. Per esempio un file gestito C++ avrà una dichiarazione secondo che fallirà:

#using <foo.dll> 

dal foo.dll non esiste ancora.

Ciò significa che foo.dll dovrebbe essere stato creato prima, ma non lo era. Come accennato in precedenza, le dipendenze sono impostate correttamente nel file di soluzione. Per esempio, se foo dipende da Baz, ho questo nel file di soluzione ...

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 

Quindi il file di soluzione ha correttamente la dipendenza. Ma la dipendenza nel progetto Foo.vcxproj è espressa solo dalla direttiva #using. Ho letto sul blog di Visual Studio che c'è un bug noto nell'ordinare i progetti in msbuild. http://blogs.msdn.com/b/visualstudio/archive/2010/12/21/incorrect-solution-build-ordering-when-using-msbuild-exe.aspx

Il loro lavoro intorno è quello di aggiungere un oggetto chiamato ai miei progetti, come questo:

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

In ogni modo, la mia domanda è: ho bisogno di farlo solo per i miei progetti gestiti C++? O faccio questo per i progetti Managed C++ AND C#? (Credo che non sia necessario farlo per i progetti C# poiché le loro dipendenze sono esplicite)

Nota: ho provato a metterlo su TUTTI i progetti nella mia build, e non ha funzionato così caldo, come ho ottenuto un sacco di strani errori di compilazione nei miei progetti nativi ...

Grazie per qualsiasi risposta a questo.

risposta

4

Ho avuto lo stesso problema, ma solo con progetti C#. Sembra che MsBuild NON stia utilizzando le dipendenze dei file di soluzione. Sta usando i riferimenti di progetto all'interno dei file di progetto per creare l'ordine di costruzione. Prova ad aggiornare tutte le tue ProjectReferences per ottenere l'ordine di costruzione corretto. Nel tuo caso devi aggiungere il riferimento del progetto gestito (dipendenza) nel tuo file di progetto C++.

La risposta alla tua domanda è: Sì, devi farlo per entrambi i progetti Managed C++ AND C#.L'impostazione delle dipendenze all'interno del file sln non è sufficiente se stai costruendo con MSBuild.

+0

Ho scoperto che se aggiungo un elemento ProjectReference per collegarmi a una libreria nativa, creo degli errori nel profondo degli script MSBuild. Quindi ho iniziato con l'aggiunta di un ProjectReference, ad altri file .csproj, per tutti i miei progetti Managed C++. Ora li aggiungerò ai miei file .csproj e vedremo come va. –

Problemi correlati