2014-11-21 7 views
2

Так что моя проблема сводится к экономии памяти.Загрузить сборку в новый домен приложения, но не CurrentDomain

По сути, мне нужно загрузить сборку в отдельный домен приложения, отличный от основного/текущего домена, проверить типы внутри этой сборки и затем выгрузить новый домен по завершении.

В настоящее время мое решение выглядит следующим образом:

AppDomain NewDomain = AppDomain.CreateDomain("newdomain"); 

foreach(string path in dllPaths) //string list of dll paths 
{ 
    byte[] dllBytes = File.ReadAllBytes(dll); 
    NewDomain.Load(dllBytes); //offending line 
} 

DoStuffWithNewDomain(); 
AppDomain.Unload(NewDomain); 

NewDomain.Load линия, кажется, чтобы загрузить сборку в новый домен, но и в текущей области моей программы.

Я использовал эту ссылку в качестве эталона - http://www.csharp411.com/how-to-load-a-net-assembly-into-a-separate-appdomain-so-you-can-unload-it/

Большое спасибо :)

+1

Интересно, если она не имеет ничего общего с документацией для [ 'AppDomain.Load метод (Byte [])'] (http://msdn.microsoft.com/en-us/library/7hcs6az6% 28v = vs.110% 29.aspx), который гласит: «Этот метод следует использовать только для загрузки сборки в текущий домен приложения. ... Чтобы загрузить сборки в другие области приложений, используйте такой метод, как CreateInstanceAndUnwrap.' –

ответ

0

Как предложил Эрик, вы должны использовать CreateInstanceAndWrap. Вот пример, который я сделал в VB некоторое время назад ...

Private Function GetCoupler() As IBatchCoupler 
     Dim CouplerProxy As IBatchCoupler = Nothing 
     Try 
      Dim DomainSetupInfo As AppDomainSetup = New AppDomainSetup() 
      DomainSetupInfo.ConfigurationFile = Path.Combine(mFilePath, "web.config") 
      DomainSetupInfo.ApplicationBase = Path.Combine(mFilePath, "bin") 
      DomainSetupInfo.ShadowCopyFiles = "true" 

Dim domain As AppDomain = AppDomain.CreateDomain("CoolDomain", AppDomain.CurrentDomain.Evidence, DomainSetupInfo) 

      'Create remote object in new appDomain via the coupler interface 
      'to avoid loading the design library into the calling application's primary appDomain 
      CouplerProxy = domain.CreateInstanceFromAndUnwrap(Path.Combine(DomainSetupInfo.ApplicationBase, "Design.dll"), "BigApplication.Design.BatchCoupler") 

     Catch ex As Exception 

      ThisLogger.Error(ex) 
     End Try 
     Return CouplerProxy 
    End Function 
2

Как уже упоминалось, загрузка сборки из байтов может произойти только для текущего домена приложения.

Вот один из способов контекстного переключения, чтобы сделать ваш целевой домен приложения текущим, используя метод DoCallBack в домене приложения (http://msdn.microsoft.com/en-us/library/system.appdomain.docallback%28v=vs.110%29.aspx).

После того, как сборка загружена, вы можете использовать тот же метод для проверки сборок и типов нового домена приложения и при необходимости создать экземпляры, прежде чем выгружать их.

class Program 
{ 
    static void Main(string[] args) 
    { 
     AppDomain newDomain = AppDomain.CreateDomain("NewDomain"); 
     List<string> dllPaths = new List<string>() { @"c:\dev\taglib-sharp.dll" }; 

     foreach (string dll in dllPaths) 
     { 
      AppDomainAsmLoader asmLoad = new AppDomainAsmLoader(File.ReadAllBytes(dll)); 
      newDomain.DoCallBack(new CrossAppDomainDelegate(asmLoad.LoadAsm)); 
     } 

     newDomain.DoCallBack(new CrossAppDomainDelegate(DoWorkWithAppDomain)); 

     AppDomain.Unload(newDomain); 
     Console.ReadKey(); 
    } 

    public static void DoWorkWithAppDomain() 
    { 
     Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); 
     foreach (Assembly asm in asms) 
     { 
      Type[] types = asm.GetTypes(); 
      foreach (Type type in types) 
      { 
       Console.WriteLine("Found the type: {0}", type.FullName); 
      } 
     } 
    } 

    [Serializable] 
    public class AppDomainAsmLoader 
    { 
     private byte[] AsmData; 

     public AppDomainAsmLoader(byte[] data) 
     { 
      AsmData = data; 
     }   

     public void LoadAsm() 
     { 
      Assembly asm = Assembly.Load(AsmData); 
     } 

    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^