2010-05-03 77 views
3

這個很奇怪。 Visual Studio 2008似乎不會釋放它爲我的項目創建的.DLLs的句柄,因此,當Studio試圖覆蓋已更改的.dll時,第二次(和隨後)會生成訪問被拒絕的錯誤。我也無法複製/刪除有問題的.dll(Tasks.dll),而Visual Studio在我構建一次後打開。 Process Explorer告訴我該文件正在被devenv.exe使用,所以我知道在構建完成後Visual Studio不會放棄它。Visual Studio 2008的.dll文件不能被覆蓋,訪問被拒絕

有沒有人看過這個之前,如果是的話,我能做些什麼呢?很明顯,在每個構建之間打開和關閉Visual Studio並不是一個可接受的解決方案,並且問題在整個系統重新啓動時仍然存在。

更多背景:我在另一個項目的UsingTask MSBuild指令中使用了導致錯誤的項目的DLL(Tasks.dll),我們稱它爲Test。項目構建順序的設置是爲了在測試之前構建任務,然後Test的AfterBuild任務將從/bin/debug/Tasks.dll調用任務。

+0

您是否將其他項目作爲項目引用,或者直接從其\ bin引用它們的DLL? – 2010-05-03 20:19:46

+0

您是否已將bin目錄添加到源代碼管理並將其鎖定? – 2010-05-03 20:26:32

+0

該項目不受源代碼管理,因此至少在那裏沒有問題...編輯以解決其他問題 – Joel 2010-05-03 20:38:02

回答

2

當然。我們遇到了同樣的問題。我不能說什麼時候問題出現,什麼條件要重現它,但在我們的情況下,它發生在我們有多個模塊的項目中,每個模塊引用了多個其他模塊,引用的模塊也引用了其他模塊等。

這真的很煩人,我們失去了許多小時試圖找出問題所在,以及如何解決問題,但沒有成功。

我們不能重構項目來簡化參考(太貴),我們也不能花更多的時間來調查問題,所以我們找到了解決方法 - 不完美,但它對我們有所幫助,並且我們多年來一直使用它項目。這是一個有點複雜,但我會盡力來形容它:

  1. 首先 - 例如項目結構
      - MyProject的(DIR)
          - 賓(DIR)
              * Proj1.exe
              * Proj2.dll
              * Proj3。等
          - Src的(DIR)
                - Proj1(DIR)
                - Proj2(DIR)
                        - 倉(DIR)
                - Proj3(DIR)
                        - 賓(DIR)

  2. Proj1(其中,假設是一個控制檯/ Windows應用程序 - *。 exe)的已設置爲輸出MYPROJECT DIR /濱

  3. Proj2(.DLL)具有建立輸出在默認情況下MyProject的/ src目錄/ Proj2/bin中設置/ ... 在我們複製結果 「MyProject的/ bin中」

    複製 「$(TARGETDIR)\ $(的TargetName).dll文件」,「$的postbuild事件(SolutionDir)賓 「
    複製」 $(TARGETDIR)\ $(的TargetName).PDB 「」 $(SolutionDir)賓「

  4. Proj3文件(.dll)已建立輸出默認設置爲MyProject的/ SRC/Proj3 /斌/ ... postbuild就像是Proj2

  5. 現在引用相同,比方說,Proj1需要Proj2和Proj2參考Proj3需要參考。

    • 首次僅Proj3構建,使得在postbuild事件的結果的命令,將被複制到MyProject的/ bin中
    • Proj2現在引用添加到組件MyProject的/ bin中/ Proj3.dll(瀏覽到裝配文件,不引用的項目)。在項目依賴手動設置,這個項目需要先建立Proj3。之後打造「Proj2」,這樣它會被複制到MyProject的/ bin中(postbuild事件命令)
    • Proj1
    • 最後添加引用到組裝MyProject的/ bin中/ Proj2.dll(再次瀏覽到組件)。在項目依賴手動設置,這個項目需要Proj2打造冷杉。從現在開始,你可以建立整體解決方案。

主要問題與上面的方法:

  • 複雜的配置和維護,特別是當項目越來越大,新項目往往添加。
  • 時,你會檢出項目新鮮目錄和您正在使用的工具,如ReSharper的,其分析代碼,它會報告錯誤很多,直到第一個版本。
  • 爲了減少編譯時間,您需要爲每個引用手動設置它不應該在本地複製。
  • 這有時還會發生,有些文件正在使用中,但在我們的環境中,它有時可能每週發生一次,有時一個月發生一次。
0

在這種情況下你可以做的最簡單的事情是使用taskkill命令殺死Visual Studio進程及其所有子進程。

您可以從命令提示符或從PowerShell中調用它。

taskkill -IM devenv.exe /F /T 

的兩個參數是/F奧爾塞和/T殺死子進程也是如此。

注意:請在命令行中輸入taskkill -?以獲取更多信息。