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.
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. –