0

我在c#.net中構建了一個Windows服務。我添加了Pre-Build和Post-Build事件以自動在構建上部署我的服務。但有時我得到這個錯誤:無法構建我的服務:無法複製文件,因爲它正在被另一個進程使用

無法複製文件 「[CompletPath ...] \斌\調試\ Business.Data.dll」 到 的 「bin \調試\ Business.Data.dll」。該進程無法訪問文件 'bin \ Debug \ Business.Data.dll',因爲它正被另一個 進程使用。

在Pre-Build事件中,我正在關閉該服務,從而終止使用Debug目錄中的文件並卸載該服務的所有任務。有一個在蝙蝠的代碼,我在預生成事件運行:

SET executionPath=%~dp0 
SET serviceName=%1 
SET frameworkPath=%2 
SET targetServicePath=%3 
SET targetBinPath=%~4 
set targetBinPath=%targetBinPath:~0,-2% 

net stop %serviceName% 
powershell -NonInteractive -executionpolicy Unrestricted -file "%executionPath%\unlockfiles.ps1" "%targetBinPath%" 
%frameworkPath%\installutil.exe /u %targetServicePath% 

Exit /b 0 

在我安裝和啓動服務生成後事件,有代碼,即使這是不是這個問題,因爲我在構建中gettring錯誤,所以post-build事件沒有執行。

SET serviceName=%1 
SET frameworkPath=%2 
SET targetServicePath=%3 

%frameworkPath%\installutil.exe /ShowCallStack %targetServicePath% 
net start %serviceName% 

我並不總是有問題。我第一次建設時通常會遇到問題,我正在清理解決方案,再次構建,並且通常在此之後工作。

+0

您是否嘗試過使用某些軟件來找出鎖定文件的內容?它是Visual Studio還是您的服務?如果沒有,請嘗試使用: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx – Niclas 2013-04-29 20:10:39

+0

我正在使用handle.exe殺死使用文件夾中文件的每個進程... – forumma 2013-05-01 14:32:10

回答

0

如果我在你的情況下,我會開始僱用和更多團隊導向的解決方案。

我會花一些時間設置使用類似Team City(這個工具是免費的,高達20個構建配置持續集成系統中。我真正從JetBrains的每一次你的團隊檢查之一。評價一切。

然後這個服務的新源代碼會被構建系統(Team City)自動檢測到,並且會觸發一組新的構建版本。

您可以有一個調試版本,它可以針對代碼運行單元測試,一個版本建立,然後還包括一個WiX Project,然後也建立一個安裝程序的服務。

完成這些流程後,您可以將其配置爲將安裝程序彈出到網絡上的已知位置,並且還可以通過電子郵件向團隊中的所有開發人員發送電子郵件,通知他們可以安裝新版本的服務。

WiX是一款非常成熟的安裝創作工具,微軟使用它的許多產品。該工具集有很多支持,並會使整個過程更加緊密,可重複和可預測。

完成所有這些工作需要一些時間,但這確實值得付出。

+0

我們已經在使用團隊城市並使用它在QA,舞臺和演示環境中部署新版本。 Windows服務與Team-city一起自動部署......但主要問題是我們的本地計算機......我們不希望每次改變時都運行安裝程序。我們是5開發人員,並在1天內,我們有10-15登記入住。非常感謝所有這些幫助。 – forumma 2013-05-02 17:47:09

+0

Ahhh好了,另一件嘗試可能是將服務編譯到不是\ bin \ Debug或\ bin \ Release目錄的位置,然後從那裏安裝。我過去曾在Visual Studio中處理這些位置的文件,並將它們全部移到解決方案目錄樹中的另一個位置(例如:\ Service \)可以修復它們。 :)幫助:) – Jammer 2013-05-02 18:06:24

+0

雅這正是我終於做了什麼......就像你建議我,我將文件複製到另一個文件夾,並從那裏安裝服務......但在預生成事件中,我仍然需要在停止服務之後擁有+/- 20秒的睡眠時間,並在能夠複製文件之前殺死所有進程(使用handle.exe)... – forumma 2013-05-03 02:23:04

1

如果我是你,我會分開這些進程。您無需卸載該服務即可更新文件。

在構建完成後,我不是很喜歡構建前/構建事件的熱情,而不是移動一些文件。

我用XCOPY/Y/C「$(TARGETPATH)」,「位置複製到」

如果沒記錯的我竟然沒居然有以更新的dll停止服務,但你可能需要在執行xcopy命令之前停止構建後的服務。

+0

我改變了我的設置做這樣的事情,但它不是更好。我殺死了我的文件被複制的目錄中的所有進程(用handle.exe殺死它),複製文件,但是一些文件仍然被鎖定。即使我用handle.exe殺死每個進程......但是如果我正在殺死這些進程,等待30次之後再複製這個小小的睡眠。一切工作正常... – forumma 2013-05-01 14:31:33

+0

只是出於興趣是你從VS內安裝和運行此服務來測試它?如果是這樣,我會考慮轉向使用單元測試,以便您可以在Visual Studio中進行測試並使用WiX構建完整的安裝程序以進行部署。 Visual Studio並不是一個真正的部署工具,這正是你試圖用你的流程來實現的工具。 – Jammer 2013-05-01 14:53:32

+0

我在生成前事件中卸載我的服務,並在生成後事件中安裝它。我的目標不是測試我的服務,我想要做的是在某人正在構建項目時自動更新Windows服務。造成這種情況的主要原因是因爲我們需要使用相同的解決方案,並且當有人編輯服務時,我們都希望在我們的計算機上獲得最新的服務。起初我們手動更新它,但是在每次編輯它時都總是告訴每個人更新服務,這是一件痛苦的事情。這就是爲什麼我們希望自動化這個過程。 – forumma 2013-05-01 15:20:07

相關問題