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