2012-01-03 8 views
6

Podsumowanie:Kiedy używać <ProjectReference> w plikach projektu?

Projekty budować w niewłaściwej kolejności z visual studio i zarządzany C++ i C# projektów

Opis:

Mam ogromny (100+ projektów) plik rozwiązania, które buduje kilka projektów w złej kolejności. Plik roztwór zawiera następujące rodzaje projektów:

  • rodzimy C/C++
  • Managed C++
  • Managed C#

Rozwiązanie zawiera wszystkie odpowiednie zależności między różnymi rodzajami projektów. Ok, więc kiedy buduję z wiersza poleceń (przy użyciu MSBuild), jest problem. Zależności dla zarządzanych projektów (zarówno C++, jak i C#) budowane są w niewłaściwej kolejności. Na przykład projekt nie powiedzie się, ponieważ brakuje zależności zarządzanej. Na przykład zarządzany plik C++ będzie miał deklarację użycia, która się nie powiedzie:

#using <foo.dll> 

ponieważ foo.dll jeszcze nie istnieje.

Co oznacza, że ​​foo.dll powinno być wcześniej zbudowane, ale tak nie było. Tak jak wspomniałem wcześniej, zależności są poprawnie skonfigurowane w pliku rozwiązania. Na przykład, jeśli foo zależy od baz, mam to w pliku rozwiązania ...

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 

Tak więc plik rozwiązania poprawnie ma zależność. Ale zależność w projekcie Foo.vcxproj jest wyrażana tylko przez dyrektywę #using. Przeczytałem na blogu visual studio, że jest znany błąd w zamawianiu projektów w msbuild. http://blogs.msdn.com/b/visualstudio/archive/2010/12/21/incorrect-solution-build-ordering-when-using-msbuild-exe.aspx

Ich praca wokół jest dodanie elementu o nazwie do moich projektów, tak:

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

Anyways, moje pytanie jest: muszę zrobić to tylko dla moich zarządzanych projektów C++? Czy mogę to zrobić w przypadku projektów Managed C++ AND C#? (Wierzę, że nie muszę tego robić dla projektów C#, ponieważ ich zależności są jawne)

Uwaga: Próbowałem umieścić to we wszystkich projektach w mojej kompilacji i nie działało tak gorąco, ponieważ mam wiele dziwnych błędów kompilacji w moich rodzimych projektach ...

Dzięki za odpowiedź na to pytanie.

Odpowiedz

4

Miałem ten sam problem, ale tylko z projektami C#. Wygląda na to, że MsBuild NIE używa zależności plików rozwiązania. Używa odwołań do projektów w plikach projektu, aby utworzyć zamówienie kompilacji. Spróbuj zaktualizować wszystkie ProjectReferences, aby uzyskać prawidłową kolejność kompilacji. W twoim przypadku musisz dodać odniesienie do projektu zarządzanego (zależność) do pliku projektu C++.

Odpowiedź na pytanie brzmi: Tak, musisz to zrobić dla obu projektów Managed C++ AND C#.Ustawianie zależności w pliku sln nie wystarczy, jeśli budujesz z MSBuild.

+0

Znalazłem, że jeśli dodaję element ProjectReference do linku do biblioteki natywnej, będę tworzył błędy w głębi skryptów MSBuild. Zacząłem od dodania ProjectReference, To innych plików .csproj, dla wszystkich moich projektów Managed C++. Teraz dodam je do moich plików .csproj i zobaczę jak to działa. –