2013-07-02 4 views
1

우리는 수많은 플러그인 dll 파일이있는 웹 응용 프로그램을 개발 중입니다.BuildManager.AddReferencedAssembly 사용을 피하는 방법

이제 우리는 필요한 모든 어셈블리를로드 할 수 있지만이를 수행하는 동안 BuildManager.AddReferencedAssembly를 사용하고 있습니다. 어느 쪽 이죠? 조금 문제가 생깁니다.

문제는 응용 프로그램을 다시 시작하지 않고 이러한 dll 파일을 업데이트해야하지만 응용 프로그램이 실행되는 동안 이러한 dll 파일이 잠겨 있다는 것입니다.

이 dll 파일에는 bin 폴더가 사용되지 않습니다. 우리는 두 개의 다른 폴더를 사용하고 있습니다. (첫 번째 ~/plugins - 우리가 파일을 복사하기 위해 second-~/ptemp-folder는 plugins 폴더에있는 파일을 복사 한 다음 bin 폴더에있는 파일처럼 복사하는 데 사용됩니다)

응용 프로그램이 작동하는 동안 알다시피, bin 폴더의 파일을 덮어 쓸 수 있으므로 응용 프로그램이 실행되는 동안 프로젝트 어셈블리를 덮어 쓸 수 있음을 의미합니다.

일부 연구 끝에 appdomainsetup에서 개인 폴더를 사용하는 것이 가능하지만 어떻게 알아낼 수없는 것으로 나타났습니다. (우리는 다른 appdomain을 만들고 싶지 않습니다, 우리는 ptemp 폴더에있는이 파일들이 메인 도메인에 연결되기를 원합니다)

불쌍한 영어에 대해서는 유감이지만 가능하다면 저희를 도와주십시오.

그런데이 dll 파일 중 일부는 일부 mvc 영역을 포함합니다. 이 필요한 경우 우리는 닷넷 4.5을 사용하는

, MVC는 4

, 나는 몇 가지 코드를 게시 할 수 있습니다.

+0

덧붙여서, 파일 잠금은 AppDomain.CurrentDomain.AppendPrivatePath (pluginsTempPath)에 의해 발생할 수 있음을 알았습니다. 선. 어쨌든, 우리는 임시 플러그 인 폴더에 이러한 dll 파일을 덮어 쓸 수 없으며 필요합니다. 지금 당장은 앱을 다시 시작하지 않고 dll을 업데이트 할 수 없습니다. – zokkan

+0

(질문 후 12 개월 이상 댓글 달기) : 자신의 AppDomains에 플러그인을로드하려고합니다. –

+0

자신의 앱 도메인에 플러그인을로드 할 수는 있지만 앱 도메인간에 데이터를 전달할 때 직렬화/비 직렬화 비용이 발생합니다. 'Execute something locally'라는 시나리오 대신 '원격 서비스 호출'과 같은 개념이 될 것입니다. – John

답변

-2

그것은이 작업을 수행하는 가장 좋은 방법은 응용 프로그램을 다시 시작 여기

+0

그렇게 생각합니다. 왜냐하면이 파일들은 mvc 자체에서도 사용되기 때문입니다. – zokkan

+0

이것은 정말로 그의 질문에 대답하지 않습니다. – John

0

우리가하고있는 일입니다 것 같습니다 :

var shadowCopyDirectories = AppDomain.CurrentDomain.SetupInformation.ShadowCopyDirectories; 
     var newShadowCopyDirectories = shadowCopyDirectories 
           + System.IO.Path.PathSeparator 
           + HostingEnvironment.MapPath("~/App_Data/DynamicAssemblies/"); 
#pragma warning disable 618 
     // Disabled compiler warning 
     AppDomain.CurrentDomain.SetShadowCopyPath(newShadowCopyDirectories); 
#pragma warning restore 618 

Basicly 임시 ASP.NET에, 지정된 디렉토리에 어셈블리의 그림자 복제를 지원합니다 이러한 어셈블리가 잠기는 것을 의미하는 파일입니다. 이 작업을 수행하는 데 쓸모없는 방법을 찾으려고했지만 30 분 동안 검색 한 후 비어있는 상태로 나왔습니다. 더 이상 검색 할 시간이 없었습니다.

1) 당신이 거 메모리에 쓰레기로 남아있다과 직면 수 있다는 것을 의미 현재 실행중인 응용 프로그램에서 '오래된'어셈블리를 언로드 할 수 없습니다 : 때문에

아직도 당신은 응용 프로그램을 다시 시작 피할 수 없다 (타입 B 어셈블리 B에서 유래 동안 전 타입 A는 조립 1에서 유래)

2) 당신은 모든 것을에게

을 다시 컴파일하는 BuildManager을 말할 수있는 방법을 필요로하는 동일한 어셈블리의 두 가지 버전을로드하는 데하여 DLL 지옥의 종류 하지만 결국 섀시 복사를 사용하는 것이 좋습니다. 왜냐하면 재활용 할 때 g에서 두 번째 작업자 프로세스가 생성 될 수 있지만 첫 번째 작업자 프로세스는 두 번째 작업자 프로세스가 준비 될 때까지 대기합니다.이 경우 사용자는 응용 프로그램 풀을 완전히 중지 할 때까지 해당 '동적'어셈블리를 업데이트 할 수 없습니다.

관련 문제