2009-09-29 9 views
10

W VS 2008, istnieje sposób, aby ustawić katalog pośredni (gdzie idą pliki .obj, a nie ostateczne cele) w projekcie C#?Ustaw katalog pośredni w C# Project

+0

+1 za dobre pytanie. Próbowałem zrobić to samo z tych samych powodów (aby nie zanieczyścić katalogu źródłowego z wynikiem kompilatora) i nie powiodło się (bez okna dialogowego z ostrzeżeniem o bezpieczeństwie - ale jest to nie do przyjęcia dla mnie). –

+0

Ktoś wie, czy ta sytuacja uległa zmianie w Visual Studio 2010/.NET4 ...? –

Odpowiedz

0

Nie wierzę w to. Możesz jednak skopiować pliki wykonywalne, pliki DLL i cokolwiek innego do innego folderu w zdarzeniu pokompilowanym. (Zbuduj kartę Wydarzenia w Właściwości projektu)

6

Musisz zastąpić BaseMenedicateIutputPath msbuild var, więcej o nim here.

+1

To działa w większości przypadków, ale szukałem sposobu na ustawienie go w każdym projekcie, więc budowanie z IDE nie powodowałoby zanieczyszczenia folderu źródłowego. Jednak ustawienie BaseIntermediateOutputPath w projekcie wyzwala ostrzeżenie o zabezpieczeniach. Niestety, nie wydaje się to możliwe. westchnienie... –

+0

Ostrzegawcze ostrzeżenie jest po to, aby powiadomić Cię, że wydarzyło się coś niezwykłego, możesz wyciszyć ostrzeżenie i nie zobaczysz go ponownie, dopóki nie zmienisz czegoś innego. –

+2

Nie ma nic niezwykłego w dostosowywaniu pośredniej lokalizacji wyjściowej. Visual Studio chętnie akceptuje projekty C++ dostosowujące położenie plików pośrednich (poprzez właściwość IntDir) bez okna dialogowego z ostrzeżeniem o bezpieczeństwie, ale rzuca furię, gdy to samo dzieje się w projekcie C#. –

1

Znalazłem rozwiązanie tego za pomocą Visual Studio Express 2013; Zapomniałem, która wersja VS wprowadziła MSBuild, i nie mogę powiedzieć na pewno, że to zadziała dla każdej innej wersji. Ale tutaj:

W C:\Windows\Microsoft.NET\Framework są podkatalogi odpowiadające wersjom .NET; W przypadku VSX2013 w moim systemie interesującym folderem jest v4.0.30319. (To jest wersja .NET używana przez MSBuild, a nie ta, której celuję.) W tym folderze znajdują się pliki .targets, które są kolekcjami reguł MSBuild.

Na początku Microsoft.CSharp.targets są niektóre reguły, które będą importować więcej plików reguł. Trzecia z tych instrukcji importu importuje z pliku określonego przez zmienną kompilacji CustomBeforeMicrosoftCSharpTargets. Możesz być w stanie dowiedzieć się nazwa tego czytając przepisy, ale łatwiej jest dodać krok niestandardowy kompilacji

echo $(CustomBeforeMicrosoftCSharpTargets) 

produkcji i spojrzeć na wyjściu. W moim przypadku pełna ścieżka była

C:\Program Files (x86)\MSBuild\v12.0\Custom.Before.Microsoft.CSharp.targets 

UWAGA: w moim przypadku, nie było już folder C:\Program Files (x86)\MSBuild\12.0 ale nie v12.0.

Więc (jako admin) Stworzyłem folder i umieszcza plik Custom.Before.Microsoft.CSharp.targets, który wygląda tak:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
     <BaseIntermediateOutputPath>$(SolutionDir)\Build\$(MSBuildProjectName)</BaseIntermediateOutputPath> 
    </PropertyGroup> 
</Project> 

UWAGA: $(ProjectName) nie działa, użyj $(MSBuildProjectName).

Kiedy zbudowany, że OBJS zostały objęte katalogu budowy pod rozwiązania, a nie w ramach projektu, w podkatalogu z typowej konwencji nazewnictwa: Debug lub Release lub x86\Debug lub x64\Release.

To nie działało dokładnie tak, jak było pożądane: naprawdę chciałem umieścić je w %TEMP%, ale zmienna nie została rozwinięta, więc skończyłem z folderem kompilacji w ramach projektu o nazwie %TEMP%. Umieszczanie rozwiniętej ścieżki w regule działało dobrze, ale inne podfoldery z %APPDATA% nie powiodły się z powodu problemów z uprawnieniami.

Zakładam, że można to wykorzystać do skonfigurowania dowolnej z tych zmiennych; czytanie domyślnych plików .TARGETS jest obowiązkowe, ale są tam przydatne komentarze.

+0

Jeszcze jedna uwaga: powyższe podejście działa dla VS CE 2017. 'CustomBeforeMicrosoftCSharpTargets' ma wartość' C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ MSBuild \ v15.0', i znowu I musiał utworzyć folder 'v15.0'; nie wymaga żadnych zmian w kodzie XML. –