2017-11-03 4 views
1

잠겨 얻을 원인 내 응용 프로그램이 솔루션 패키지 폴더의 메모리에 DLL을로드했기 때문에 그렇게합니다. 이 하나 개의 파일 내 응용 프로그램에서 '사용'점점 끝나기 때문에 는 nuget 패키지 DLL이 나는 다음과 같은 코드를 실행하고

는 특히 Microsoft.Bcl.Build.Tasks.dll

, 내 응용 프로그램은 응용 프로그램을 닫을 때까지 임시 디렉토리를 삭제할 수 없습니다.
치킨 앤 에그 - 폴더가 없어 질 때까지 응용 프로그램을 닫고 싶지 않습니다. 응용 프로그램이 닫힐 때까지는 폴더를 삭제할 수 없습니다.

누구나 작동하는 것으로 알려진 해결책이 있습니까?
예 :
일단 DLL이 응용 프로그램에로드되면 영구적이며 이전에 릴리스 될 수 없다는 것을 알고 있습니다.
그러나 과거에는 응용 프로그램 내에서 추가 AppDomains를 만든 다음 기본 응용 프로그램 대신 AppDomains에 어셈블리를로드 할 수 있다고 들었습니다. 그런 다음 AppDomain 및 관련 참조/어셈블리를 처리 할 수 ​​있으며 기대하고 있습니다. 핸들?

참고 - 위의 Nuget 패키지 복원을 호출하고 있지만 코드를 단계적으로 실행하면 확실히 잠금이 빌드 단계에서 발생하며 누겟 복원에서는 수행되지 않는다고 말할 수 있습니다.

답변

1

한 번만 비슷한 문제가 있었지만 BuildManager를 사용하지 않고 빌드 파일을 사용했으며 msbuild 프로세스를 실행할 때 비슷한 오류가 발생했습니다.

내가 작업 관리자를 살펴보면 일부 파일을 잠근 상태로 유지하는 여러 msbuild 프로세스가 있음을 발견했습니다.

msbuild에는 프로세스 중 일부가 활성 상태로 유지되므로 추가 빌드가 더 빠를 것이므로 nodereuse이라는 항목이 있기 때문입니다.

이 당신이 다음 msbuild 매개 변수를 사용할 수 있습니다 비활성화하려면 :

/nodeReuse : 값 또는 /NR :
사용 또는 MSBuild를 노드의 재 사용을 비활성화 값입니다.
다음 값을 지정할 수 있습니다.

  • 참. 빌드가 완료된 후에도 노드가 남아있어 후속 빌드에서 사용할 수 있습니다 (기본값).
  • 거짓. 빌드가 완료된 후에도 노드는 남아 있지 않습니다.

노드는 실행중인 프로젝트에 해당합니다./maxcpucount 스위치를 포함 시키면 여러 노드가 동시에 실행할 수 있습니다.

이 매개 변수를 false으로 설정하면 잠긴 파일 문제가 모두 사라졌습니다. 아마도 이것은 당신을 도울 것입니다.

1

당신은 당신이 그것을 폐기하기 전에이 있다는 신호 바와 같이, BuildManager.DefaultBuildManager.EndBuild()를 호출 할 수 있습니다 "더 이상 구축 요청이 예상 (또는 허용)하고 BuildManager 정리 수"

+0

불행하게도 그 문제가 해결되지 않았다. 이 문제는 BuildManager 클래스에 그다지 국한되지 않습니다. 호스트 응용 프로그램에로드되지만 언로드되지 않는 DLL의 기술적 인 측면과 관련이 있습니다. C# dll을 언로드하는 것을 방해합니다. 이로 인해이 Microsoft BCL dll이 잠기는 것에 대처하는 것이 거의 불가능합니다. – Baaleos

+0

그냥 아이디어지만 별도의 AppDomain이 트릭을 수행해야합니다. 기본적으로 모든 것을로드하고 완료 할 때 파괴 할 수 있습니다! –

+0

불행히도 너무 작동하지 않았다. - 나는 전체 빌드를 실행하고 프록시 도메인 내에서 프로세스를 실행하려고 시도했다. dll이 실제 참조/assembly.load() 대신 프로젝트/대상 가져 오기로 csproj에 의해로드되기 때문에 생각합니다. – Baaleos