2013-04-06 2 views
4

사용자 지정 프로젝트 형식을 작성하기 위해 어셈블리 A에있는 사용자 지정 MSBuild 작업이 있습니다 ('TestAppContent'라고 부름). 'A'는 현재 개발중인 다른 어셈블리 'B'를 참조합니다.MSBuild 어셈블리 잠금

'B'를 테스트하려면 TestApp, TestApp을 사용합니다. TestApp은 우리의 커스텀 태스크를 사용하여 빌드를 얻는 TestAppContent에 의존합니다.

문제는 작업이로드 된 후 작업 ('A')이 포함 된 어셈블리에 대한 참조가 있으므로 'B'어셈블리가 MSBuild 또는 VisualStudio 프로세스에 의해 잠기는 것이 문제입니다.

어셈블리를 단순히 언로드 할 수없고 분리 된 AppDomain을 사용하면 작동하지 않으므로 어떻게이 잠금을 멈출 수 있습니까?

Microsoft XNA는 빌드 프로세스에 사용자 지정 어셈블리를 제공 할 수 있으므로이 작업을 수행 할 수 있으며 사용자 지정 어셈블리를 다시 빌드 할 수있게되면 릴리스됩니다.

답변

2

유일한 방법은 AppDomain을 사용하고 해당 섀도 복사본을 활성화하는 것입니다. 현재 AppDomain에서 섀도 복사본을 활성화 할 수는 없지만 시도해 볼 수는 있습니다 (질문은 here을 참조하십시오)

또는 수동으로 dll을 다른 위치로 복사하여로드하여 (프로그래밍 방식으로) 원래 dll이로드되지 않도록 할 수 있습니다 잠금이 해제 된 상태로 유지됩니다. 그러나 동일한 dll을 두 번로드 할 수 없습니다. 새 버전을 언로드하고로드하려면 (또는 프로그램을 다시 시작하려는 경우) 별도의 AppDomain이 필요합니다.

EDIT : 또한 AppDomain을 사용할 수도 있습니다 .CurrentDomain.AssemblyResolve를 사용하여 프로그램을 작성하면 dll을로드하려고 시도합니다. 거기서 다른 곳에 복사하여이 사본을로드 할 수 있습니다.

+0

로드하고 잠그는 프로그램이 Visual Studio이므로 프로그램을 다시 시작할 수 없습니다.임시 디렉토리를 사용하여 섀도 복사본을 시도하겠습니다. 그러나 빌드를 실행할 때마다 파일을 복사하고 디스크 낭비를 너무 많이 씁니다. – greenboxal

+0

예.하지만 섀도 복사본은 windows에서 처리합니다. * 임시 파일을 정기적으로 삭제해야합니다. – Fabske

2

나는 그것이 당신을 자동으로 달성하기 위해 노력하고 있기 때문에 그다지 도움이되지 않을 것이라고 생각하지만 이것을 달성하기위한 하나의 수동 방법은 sysinternals ProcessExplorer을 사용하여 dll을 사용하는 특정 프로세스를 죽이는 것을 발견했습니다. 그러나 살인은 VS2013을 해치는 것처럼 보이지 않으므로 MSVS를 다시 시작할 필요가없는 해결 방법이됩니다. 내 비주얼 스튜디오 과정 이전에 DesignLibrary 어셈블리를 만든 MSBuild에서 인스턴스를 인스턴스화이 경우

은 - 이제 프로젝트 SomeLibrary 바로 빌드 만 내에서 사용하는, 고정된다. 이 시점에서 잠금을 유지하는 MSBuild 작업을 종료하지 않고도 DesignLibrary 어셈블리를 다시 작성할 수는 없습니다.

나는 그것이 그 자체로 생성 된 파일, 또는이 지저분한 상황을 중간에 아마 비주얼 스튜디오를 다시 시도 할 경우 MSBuild.exe를 빌드하는 동안 확인하고 싶습니다. 또 다른 생각 : 수동으로했던 것처럼 프로세스 트리를 검사하고 자동으로 프로세스를 종료하는 것이 가능할 수도 있습니다. 매우 해킹 된 해결 방법;)

0

일반적으로이 문제를 해결하는 방법 중 하나는 두 가지 솔루션을 사용하는 것입니다. 첫 번째는 Tasks를 빌드 한 다음을 실행하여 F5 키를 누르면 두 번째 .sln을로드합니다.

두 번째 솔루션은 첫 번째 솔루션에서 생성 된 작업을 사용하여 두 번째 솔루션을 두 번째 devenv.exe 프로세스에로드합니다. 디버깅을 중지하면 두 번째 Visual Studio가 닫히고 빌드 작업이 포함 된 어셈블리가 해제됩니다.

관련 문제