2012-12-08 3 views
0

비슷한 질문을 많이 발견했지만 해결책을 찾지 못했습니다. 내가 다음 코드를 한AppDomain 예외가 throw되었습니다.

는 :

string file = "c:\\abc.dll"; 
    AppDomainSetup ads = new AppDomainSetup(); 
    ads.PrivateBinPath = Path.GetDirectoryName(file); 
    AppDomain ad2 = AppDomain.CreateDomain("AD2", null, ads); 
    ProxyDomain proxy = (ProxyDomain)ad2.CreateInstanceAndUnwrap(typeof(ProxyDomain).Assembly.FullName, typeof(ProxyDomain).FullName); 

Assembly asm = proxy.GetAssembly(file); // exception File.IO assembly not found is thrown here after succesfully running the funktion GetAssembly. 


    public class ProxyDomain : MarshalByRefObject 
    { 
    public Assembly GetAssembly(string assemblyPath) 
    { 
     try 
     { 
      Assembly asm = Assembly.LoadFile(assemblyPath); 
      //...asm is initialized correctly, I can see everything with debugger 
      return asm; 
     } 
     catch 
     { 
      return null; 
     } 
    } 
    } 

다음 내 GetAssembly의 funktion는 다른 유형의, 심지어 내 사용자 정의 직렬화 클래스를 반환 가장 흥미로운 것은, 모든 것이 괜찮습니다. 누군가 내가 누락 된 것을 알고 있습니까? 또는로드 된 어셈블리를 다른 도메인으로 반환하는 것은 불가능합니다.

은 기본 응용 프로그램의 bin 디렉토리에 앉아 당신이

+2

왜 '어셈블리'를 상위 앱 도메인으로 반환하려고합니까? 일반적으로 이것은 피할 수 있으므로 상위 응용 프로그램 도메인은 어셈블리를로드 할 필요가 없으며 하위 응용 프로그램 도메인이 언로드 될 때 언로드 될 수 있습니다. –

+0

이 ProxyDomain 클래스를 사용하여 달성하려는 것을 설명하면 도움이됩니다. 전체 어셈블리를 기본 도메인으로 되돌리려면 새로운 AppDomain이 필요한 이유는 무엇입니까? –

+0

글쎄, 난 정말 내 첫 번째 appdomain이 어셈블리가 필요하지 않습니다. 폴더에 많은 파일이 있고 특수 클래스 속성을 포함하는 어셈블리를 찾아서 DLL 이름 목록을 반환해야했습니다. 메인 appdomain에로드 된 모든 어셈블리는 응용 프로그램이 다시 시작될 때까지 삭제할 수 없으므로 두 번째 응용 프로그램 도메인이 필요했습니다. 내 문제를 해결했지만 여전히 다른 모든 유형을 반환하는 이유를 알고 어셈블리를 반환하지 못합니다. – VladL

답변

0

내가 File.IO 상상 감사? 그렇다면 abc.dll은 주 응용 프로그램이 C:\\에 있지 않은 경우 찾을 위치를 알 수 없습니다.

당신은 참조 된 DLL을

  • 변경 AppDomainSetup의 기본 디렉토리를 (DLL을 찾기 위해 알고 .NET 장소 중 하나입니다 어느 AppDomain.AssemblyResolve 이벤트에

    1. Bind 중 하나를 수동으로로드해야합니다)
    2. DLL을 찾기 위해 알고 .NET 장소)
    3. 광고의 또 다른 하나입니다합니다 (GACFile.IO 설치 d 의 위치를 ​​AppDomainSetup의 개인 프로빙 경로 (다른 위치 인 .NET은 dll을 찾으려고 시도합니다)에 연결합니다.
  • +0

    File.IO는 예외 유형입니다. abc.dll은 동일한 디렉토리에 있지 않으므로 programm가 실행됩니다. 그리고 내가 말했듯이, 다른 모든 반환 유형이 작동합니다. 그냥 어셈블리가 없습니다. – VladL

    +0

    이벤트가 이벤트를 캐치하지 않았고 기반을 변경하지 않았습니다. – VladL

    +0

    @VladL, "File.IO"예외 유형이 없습니다. 모든 예외 유형에는 이름에 "예외"가 있습니다. 예외 유형/텍스트를 복사하여 붙여 넣으시겠습니까? –

    관련 문제