2012-03-15 3 views
3

메모리를 사용하여 WCF에서 어셈블리를로드하려고합니다. 언제 모든 것이 잘 작동하고 :AssemblyResolve에서 AppDomain.CreateDomain을 어떻게 사용합니까?

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
Assembly[] assBefore = AppDomain.CurrentDomain.GetAssemblies(); 
foreach (byte[] binary in deCompressBinaries) 
    loadedAssembly = AppDomain.CurrentDomain.Load(binary); 

는하지만 AppDomain.CreateDomain를 사용하려면이 아닌 현재 도메인 :

protected void LoadApplication() 
{ 
    this.ApplicationHost = AppDomain.CreateDomain("TestService", null, new AppDomainSetup 
    { 
     ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase 
    }); 

    ApplicationHost.AssemblyResolve += new ResolveEventHandler(OnAssemblyResolve); 
    foreach (AssemblyName asmbly in System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies()) 
    { 
     ApplicationHost.Load(asmbly); 
    } 
    List<byte[]> deCompressBinaries = new List<byte[]>(); 
    foreach (var item in AppPackage.Item.AssemblyPackage) 
     deCompressBinaries.Add(item.Buffer); 
    var decompressvalues = DeCompress(deCompressBinaries); 
    deCompressBinaries.Clear(); 
    deCompressBinaries = decompressvalues.ToList(); 

    foreach (byte[] binary in deCompressBinaries) 
     ApplicationHost.Load(binary); 

    Assembly[] assAfter = AppDomain.CurrentDomain.GetAssemblies(); 
} 

Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    return Assembly.Load(args.Name); 
} 

나는 두 클래스 라이브러리를 가지고으로 ClassLibrary1 및 ClassLibrary2는 아래의 사용 :

namespace ClassLibrary2 
{ 
    public class Class1 : MarshalByRefObject 
    { 
     public Class1() 
     { 

     } 

     public int GetSum(int a , int b) 
     { 
      try 
      { 
       ClassLibrary1.Class1 ctx = new ClassLibrary1.Class1(); 
       return ctx.Sum(a, b); 
      } 
      catch 
      { 
       return -1; 
      } 
     } 

     public int GetMultiply(int a, int b) 
     { 
      return a * b; 
     } 
    } 
} 

Classlibrary2는 ClassLibrary1에 따라 다릅니다. 그래서 assemblyresolver를 사용하고 있습니다. 하지만 에 오류가 발생합니다. ApplicationHost.Load (binary); :

Error: Could not load file or assembly 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

은 또한 그것은 ASSEMBLYRESOLVER 발사되지 않습니다. 내 커서가 Assemblyresolver 메서드로 이동하지 않습니다. 어떻게 해결 방법으로 AppDomain.CreateDomain을 사용합니까?

+0

본 QA의 정확한 복제본은 다음과 같습니다. http://www.rqna.net/qna/mqpzvv-how-to-use-appdomain-createdomain-with-assemblyresolve.html WTF? –

답변

0

저는 개인적으로 바이트 배열에서 어셈블리를로드하는 것을 좋아하지 않습니다. 어셈블리를 임시 폴더에 저장 한 다음 해당 폴더에서로드하는 것이 더 좋습니다. 이 기사를보십시오 : Application Domains is hard….

+1

링크가 깨졌습니다 = ( – killthrush

+0

링크가 끊어졌습니다 : "서버 오류 '/'응용 프로그램 리소스를 찾을 수 없습니다 설명 : HTTP 404.'" –

+0

모든 링크가 끊어졌습니다 ... =/누구든지 알아 냈습니까? – JobaDiniz