Visual Studio 2008 blokuje niestandardowe zespoły Zadań MSBuild

Rozwijam niestandardowe zadanie MSBuild, które buduje warstwę ORM i używam go w projekcie. Przeszkadza mi zachowanie Visual Studio polegające na trzymaniu plików DLL MSBuild task i nie puszczaniu.

Chciałbym zorganizować swoje rozwiązanie w ten sposób;

My Solution
 |
 +- (1) ORM Layer Custom Task Project
 |  |
 |  +- BuildOrmLayerTask.cs     // here's my task
 |  
 +- (2) Business Logic Project  // and here's the project that uses it.
    |
    +- <UsingTask TaskName="BuildOrmLayerTask" AssemblyFile="$(TaskAssembly)" />

Jednakże, gdy projekt (2) buduje, blokuje się na złożeniu z projektu (1). Więc teraz nie mogę ponownie zbudować projektu (1) bez zamknięcia rozwiązania i ponownego otwarcia Go.

Is there any way I Czy Można organizować rzeczy tak, aby niestandardowe zadanie budowania nie było blokowane przez Visual Studio?

Author: abatishchev, 2010-07-30

3 answers

(Edytuj: Sayed Ibrahim Hashimi , który dosłownie napisał książkę na msbuild, sugeruje klasę AppDomainIsolatedTask dla lepszego podejścia)

Sam udało mi się rozwiązać ten problem...

Znalazłem ten post na forum dana Moseley ' a, jednego z programistów MSBuild z Microsoftu:

Cześć,

Niestety dzieje się tak dlatego, że MSBuild ładuje zespoły zadań w primary appdomain. CLR nie Zezwalaj na rozładowanie zespołów z appdomain, ponieważ umożliwia to ważne optymalizacje na ich część.

Jedyne obejście, które proponuję, to wołanie tomsbuild.exe to buduj projekty wykorzystujące zadanie. Aby to zrobić, stwórz MSBuild.exe jako zewnętrzne narzędzie w VS.

Dan
programista na msbuild
DanMoseley-MSFT

Wygląda na to, że aby zatrzymać zamki, musisz odradzać Nowy MSBuild.proces exe. To nie może być ten, który biegnie w Visual Studio, ponieważ po uruchomieniu MSBuild ładuje zadania do podstawowej domeny aplikacji Visual Studio i nigdy nie można ich rozładować.

  • Utwórz nowy projekt MSBuild (a .csproj lub podobne), który nadpisuje cel "Build" i wykonuje swoje niestandardowe akcje, np.]}

    <!-- fragment of Prebuild.csproj -->   
    <Target Name="Build">   
         <BuildOrmLayerTask Repository="$(Repository)" />   
    </Target>
    
  • Dodaj go do visual studio, jeśli chcesz, ale Użyj Menedżera konfiguracji, aby upewnić się, że jest nie wbudowany w żadnej konfiguracji. Tylko Niech VS zajmie się kontrolą źródła i takie jak, nie Budynek.

  • Edytujplik csproj projektu, który zależy od Prebuild.csproj. Dodaj cel BeforeBuild, który wywołuje MSBuild używając zadania Exec. Spowoduje to rozpoczęcie nowego procesu, a gdy ten proces się zakończy, blokady plików są zwalniane. Przykład;

    <PropertyGroup>   
         <PrebuildProject>$(SolutionDir)Prebuild\Prebuild.csproj</PrebuildProject>   
    </PropertyGroup>   
    <Target Name="BeforeBuild">   
         <Exec Command="msbuild.exe &quot;$(PrebuildProject)&quot;" />   
    </Target>
    

Teraz, kiedy budujesz zależny projekt, uruchamia MSBuild w nowym procesie przed uruchomieniem kompilacji.

 26
Author: Steve Cooper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-09 04:08:57

Czy możesz edytować pliki projektu i dołączyć następującą deklarację własności

<PropertyGroup>
    <GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies>
</PropertyGroup>
Daj mi znać, jeśli ci to pasuje.
 4
Author: Sayed Ibrahim Hashimi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-04 06:53:20

Jak wspomniałem w komentarzu skierowanym do @Al-Muhandis, wydaje się, że możliwe jest utworzenie wrappera wokół niestandardowego zadania, tak aby wrapper został zablokowany, ale nie DLL zadania niestandardowego. Podjąłem pierwszą próbę zrobienia tego przy pomocy projektuisolated-task . Może być wadliwy i na razie działa tylko z VS2008. Zapraszamy do ściągania wniosków.

Pomysł na projekt opierał się na obserwacji, że zadania pochodzące z MarshalByRefObject (BYĆ MOŻE AppDomainIsolatedTask) wydają się być ładowane do główna domena aplikacji dla celów refleksji, ale nowa domena aplikacji jest tworzona w celu wykonania zadania. Ponieważ ładowanie do głównej domeny aplikacji nadal wydaje się blokować bibliotekę DLL, przydatne było utworzenie biblioteki DLL z zadaniem pochodzącym z AppDomainIsolatedTask, która ładuje niestandardowe biblioteki DLL zadań. W ten sposób biblioteka DLL wrapper zostaje zablokowana, ale ponieważ wykonuje we własnej domenie aplikacji, biblioteki DLL zadań niestandardowych są rozładowywane, gdy domena wykonująca zadanie wrapper jest rozładowana. Ta procedura pozwala uniknąć blokady niestandardowe biblioteki DLL zadań po zakończeniu kompilacji.

 3
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-10 19:10:24