2013-04-06 25 views
4

我有一個自定義MSBuild任務(駐留在程序集A)來構建自定義項目類型(我們稱之爲'TestAppContent')。 'A'引用當前正在開發的另一個程序集'B'。MSBuild大會鎖

爲了測試'B',我使用了一個測試程序TestApp。 TestApp依賴於TestAppContent使用我們的自定義任務來構建。

問題是,在加載任務後,'B'程序集被MSBuild或VisualStudio進程鎖定,因爲包含任務('A')的程序集有一個對它的引用。

因爲我不能簡單地'卸載'程序集和使用分離的AppDomain不起作用,我怎麼能阻止這個鎖?

我知道Microsoft XNA可以這樣做,因爲您可以將自定義程序集提供給構建過程,並在它們之後發佈,因此您可以重新構建這些自定義程序集。

回答

2

唯一的方法是使用AppDomain並在其上激活Shadow Copy。我不認爲你可以激活目前的AppDomain的影子副本,但你可以嘗試(見問題here

或者你可以手動複製dll在其他地方並加載它(編程),以便原始dll不會被加載並將保持解鎖狀態。但你不能加載相同的DLL兩次...所以你需要一個單獨的AppDomain,如果你想卸載並加載一個新版本(或重新啓動你的程序)

編輯: 你也可以使用AppDomain .CurrentDomain.AssemblyResolve在程序中嘗試加載dll時攔截。在那裏你可以將它複製到別處並加載這個副本。

+0

我無法重新啓動它,因爲加載並鎖定它的程序是Visual Studio。我會嘗試使用臨時目錄的影子副本,但每次發出構建時都會複製這些文件,導致磁盤浪費太多。 – greenboxal 2013-04-07 02:19:26

+0

是的,但影子副本由Windows處理,它應*定期刪除臨時文件 – Fabske 2013-04-07 18:41:23

2

我認爲它不會幫助你那麼多,因爲你試圖自動實現它,但一個手動的方式來實現這個我發現是使用sysinternals ProcessExplorer殺死使用DLL的具體過程。但是殺害似乎並沒有損害VS2013,這使得這是一種解決方法,無需重新啓動MSVS。

在這種情況下我的Visual Studio過程實例先前創建的DesignLibrary裝配一個MSBuild實例 - 現在被鎖定,該項目SomeLibrary只使用構建中的權利。此時,如果不殺死持有該鎖的MSBuild任務,則無法重建DesignLibrary程序集。

我想有在生成過程中的MSBuild.exe檢查,如果它試圖重建自身創建的文件,或者也許視覺工作室介入這種混亂的局面。再想一想:或許可以檢查進程樹並自動終止進程,就像我手動執行一樣。一個非常hacky的解決方法;)

0

我通常解決這個問題的一種方法是有兩個解決方案。第一個生成任務,然後掛鉤它啓動devenv.exe加載第二個.sln,當我按下F5時。

第二個解決方案消耗第一個內置的任務,使其被加載到第二個devenv.exe進程中。當您停止調試時,第二個Visual Studio將關閉,並且具有構建任務的程序集將被釋放。