2013-05-30 2 views
0

이것은 중복 된 것처럼 보일 수 있지만 사실은 다른 질문입니다!Assembly.Load (byte []) load once once

시나리오는 다음과 같습니다. 시스템에서 동적으로로드 된 모든 DLL을 반복 실행하여 데이터를 가져 오는 웹 앱이 있습니다. 이러한 dll은 웹 사이트의 사용자가 추가합니다. 여러 번로드 같은 DLL을 가지고,

pulic void GetNews(){ 
    foreach(var i in ListOfDllPaths){ 
     Assembly dll = Assembly.Load(File.ReadAllBytes(i)); 
     SomeInterface if = CreateInstance(dll); //This methods does all the validation and such 
     if.DoMethod(); 
    } 
} 

지금 문제가 그 GetNews()를 호출 할 때마다 같은 DLL을 모두 다시로드에 :

의사 코드는 다음과 같이 될 것이다. Assembly.LoadFrom 또는 LoadFile을 사용하여이 문제를 피할 수 있지만 삭제하고 싶을 수 있기 때문에 원하지 않는 파일을 잠글 수 있습니다.

또 다른 옵션은 새로운 앱 도메인을 사용하여로드하고 메소드를 호출하여 언로드 한 다음 해당 도메인에 인터페이스 dll을로드해야합니다.이 도메인은 실제로 경로를 모릅니다. 웹 응용 프로그램에서. 하나의 앱 도메인에서 다른 앱 도메인으로 데이터를 옮기는 것은 고통스럽고 달성하기가 너무 어렵습니다.

하나의 세 번째 옵션은 쉐도우 복사본을 사용하는 것이지만 그 다음 쉐도우 복사본을 삭제할 수는 없습니다.

옵션? 기본적으로 내가 필요로하는 것은 dll을로드하고, 사용하고, 언로드하고, 이동합니다. 당신이 정말로 그것을 언로드해야하는 경우

+0

어쩌면 내가 여기있는 문제를 오해하고있다. 그러나 dll을로드하기를 원한다면 이미로드 한 파일 이름의 목록을 유지하고 매번 그 목록을 확인해야한다. 당신은 새로운 것들만로드합니까? – joshuahealy

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야한다"는 것을 참조하십시오. –

+1

별도의 appdomain을 사용하여 언로드해야하는 경우 유일한 옵션입니다. – Yaur

답변

3

당신은 당신이 한 번만 각 어셈블리를로드 할 필요가있는 경우

(예 : How to unload an assembly from the primary AppDomain? 참조) 별도의 응용 프로그램 도메인을 사용하는 것 외에 선택의 여지가 없지만, 옛 사람을 언로드에 대해 걱정하지 않는다 당신은 어떤 어셈블리가 스스로로드되는지를 관리 할 필요가 있습니다. 이것을하기위한 쉬운 방법은로드하기 전에 각 파일의 해시를 취하는 것입니다. 뭔가 비슷하다 :

Dictonary<string,bool> loadedAssemblies = new Dictonary<string,bool>(); 

using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider()) 
{ 
    var hash = Convert.ToBase64String(sha1.ComputeHash(byteArray)); 
    if(loadedAssemblies.ContainsKey(hash)) continue; 
    loadedAssemblies[hash] = true; 
    Assembly dll = Assembly.Load(File.ReadAllBytes(i)); 
    SomeInterface if = CreateInstance(dll); //This methods does all the validation and such 
    if.DoMethod(); 
} 

다른 항목으로 버전을 지정하려면 인터페이스에 메타 데이터를 추가하는 것이 좋습니다.

+0

의 응답 제안과 동시 사전을 사용하여 해결 If dll은 이미로드되어 있습니다 (해시에서 찾을 수 있습니다) 어떻게 어셈블리를 다시 얻을 수 있습니까? 대신 어셈블리 참조를 저장해야합니까? – user1777914