0

Windows 서비스를 C# .net으로 빌드합니다. Pre-Build 및 Post-Build 이벤트를 추가하여 빌드에 자동으로 서비스를 배포했습니다. 그러나 언젠가 나는이 오류가있어 :서비스를 구축 할 수 없습니다. 다른 프로세스에서 파일을 사용하고 있기 때문에 파일을 복사 할 수 없습니다.

파일을 복사 할 수 없습니다를 "[CompletPath ...] \ 빈 \ 디버그 \ Business.Data.dll" "디버그 \ 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 

이 코드는이 경우에도이 포스트 빌드 이벤트가 실행되지 않기 때문에 빌드에서 오류가 발생하기 때문에 문제가 아닙니다.

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

+0

handle.exe를 사용하여 폴더의 파일을 사용하는 모든 프로세스를 종료합니다. – forumma

답변

0

나는 귀하의 상황에 있다면 나는 더 많은 팀 지향적 인 솔루션을 고용하기 시작할 것입니다.

내가 Team City 같은 (이 도구는 최대 개까지 20 개 빌드 구성에 대한 무료를 사용하여 지속적인 통합 시스템을 설정 시간을 보낼 것입니다. 나는 정말 JetBrains의에서 모든 것을 평가. 그 다음

를 때마다 팀의 검사 중 하나 새로운 소스 코드는 빌드 시스템 (Team City)에 의해 자동으로 감지되고 새로운 빌드 세트가 트리거됩니다.

코드에 대한 단위 테스트를 실행하는 디버그 빌드가있을 수 있습니다 또한 WiX Project이 포함 된 빌드를 작성한 다음이 서비스의 설치 관리자를 만듭니다.

일단 프로세스가 완료되면 네트워크의 알려진 위치에 설치 프로그램을 팝업하도록 구성 할 수 있으며 팀의 모든 개발자에게 이메일을 보내어 새로운 버전의 서비스를 설치할 수 있음을 알릴 수도 있습니다.

WiX는 많은 제품에 대해 Microsoft에서 사용하는 매우 성숙한 설치 제작 도구입니다. 도구 세트에 대한 많은 지원이 있으며 전체 프로세스를 훨씬 더 강력하고 반복 가능하며 예측 가능하게 만듭니다.

이 모든 작업을 완료하는 데 약간의 시간이 걸리지 만 실제로 노력할 가치가 있습니다.

+0

우리는 이미 팀 도시를 사용 중이며이를 통해 QA, 스테이징 및 데모 환경에 새 버전을 배포합니다. Windows 서비스는 팀 도시와 자동으로 배포됩니다 ...하지만 주된 문제는 로컬 컴퓨터 때문입니다 ... 우리는 무언가가 바뀔 때마다 설치 프로그램을 실행하고 싶지 않습니다. 우리는 5 dev과 1 일 우리는 10-15 체크인 같은 있습니다. 이 모든 도움에 감사드립니다. – forumma

+0

Ahhh OK, 또 다른 시도는 \ bin \ Debug 또는 \ bin \ Release 디렉토리가 아닌 위치에 서비스를 컴파일하고 거기에서 설치할 수 있습니다. Visual Studio에서이 위치의 파일을 과거에 처리하고 솔루션 디렉토리 트리 (예 : \ Service \) 내의 다른 위치로 이동하면 문제가 해결 될 수 있습니다. 도움에 아무런 문제가 없습니다. – Jammer

+0

예. 정확히 마침내 제가 한 일입니다. 제게 제안한 것처럼, 다른 폴더로 파일을 복사하고 거기에서 서비스를 설치하고 있습니다 ...하지만 미리 빌드 이벤트에서, 나는 여전히 서비스를 중지하고 파일을 복사 할 수 있기 전에 handle.exe를 사용하여 모든 프로세스를 죽인 후 +/- 20 초의 절전 모드를 필요로합니다 ... – forumma

1

내가 본인 인 경우 이러한 프로세스를 구분할 것입니다. 파일을 업데이트하기 위해 서비스를 제거 할 필요는 없습니다.

저는 빌드가 완료된 후 일부 파일을 이동하는 것보다 훨씬 많은 사전/사후 빌드 이벤트에 대한 위대한 팬이 아닙니다.

나는 XCOPY/Y/C "$ (있는 TargetPath)" "위치"에 복사를 사용

메모리 내가하지 않았다 제공하는 경우에도 실제로는하지만, DLL을 업데이트하기 위해 서비스를 중지해야 xcopy 명령을 수행하기 전에 포스트 빌드에서 서비스를 중지해야 할 수도 있습니다.

+0

변경되었습니다. 이런 식으로 뭔가를 할 수있는 설정이 있지만 좋지는 않습니다. 내 파일이 복사 된 (handle.exe로 죽이는) 디렉토리에서 모든 프로세스를 죽이고 파일을 복사하지만 일부 파일은 여전히 ​​잠겨 있습니다. handle.exe를 사용하여 모든 프로세스를 죽이는 경우에도 ... 그러나이 프로세스를 죽이고 30 초를 대기하고이 작은 수면 후에 복사하면. 모든 것이 잘 작동하고 있습니다 ... – forumma

+0

VS에서 테스트하여이 서비스를 설치하고 실행하고 있습니까? 그렇다면 단위 테스트를 사용하여 Visual Studio 내에서 테스트하고 배포 용 WiX를 사용하여 전체 설치 프로그램을 작성할 수 있도록하는 것이 좋습니다. Visual Studio는 실제로 배포 도구가 아니며 프로세스와 함께 사용하려고합니다. – Jammer

+0

빌드 전 이벤트에서 서비스를 제거하고 빌드 후 이벤트에 설치합니다. 내 목표는 내 서비스를 테스트하는 것이 아니라, 내가하고 싶은 일은 프로젝트를 빌드 할 때 자동으로 Windows 서비스를 업데이트하는 것입니다. 이것의 주된 이유는 우리가 동일한 솔루션으로 작업하기 때문이며 누군가가 서비스를 편집 할 때 우리 모두는 우리 컴퓨터에서 서비스를 최신 상태로 유지하기를 원합니다. 처음에는 수동으로 업데이트했지만, 편집 할 때마다 항상 모든 사람에게 서비스를 업데이트하라고 말하기는 쉽지 않습니다. 이것이 우리가 프로세스를 자동화하려는 이유입니다. – forumma