2013-06-20 26 views
6

Bir appdomain'i nasıl oluşturabilirim, meclisleri nasıl ekleyebilirim ve o uygulama etki alanını nasıl yok edebilirim? Bu ne denedim: Ben de denedimÖzel AppDomain oluştur ve ona derlemeler ekle

static void Main(string[] args) 
    {   
     string pathToExe = @"A:\Users\Tono\Desktop\ConsoleApplication1.exe"; 

     AppDomain myDomain = AppDomain.CreateDomain("MyDomain"); 

     Assembly a = Assembly.Load(System.IO.File.ReadAllBytes(pathToExe)); 

     myDomain.Load(a.FullName); // Crashes here!    
    } 

:

myDomain.Load(File.ReadAllBytes(pathToExe)); 

nasıl uygulama etki alanı için bir montaj ekleyebilir. Ben bulabilmesi yaptıktan sonra yansıma yoluyla yöntemi çalıştırmak ve sonra AppDomain

Ben olsun istisna yok:

dosya veya derleme 'ConsoleApplication1 yüklenemedi, Sürüm = 1.0.0.0, Culture = neutral, PublicKeyToken = null 'veya bağımlılıklarından biri. sistemi belirtilen dosyayı bulamıyor.

+2

Kendi etki alanına derleme yükleme daha kolaydır - böylece yerine bazı kod yürütmeyi düşünün diğer alana montaj itmeye çalışıyor İstediğiniz montajı yüklemek için diğer etki alanı (bağımlılıkları önceden yüklemeniz veya montaj arama yolunu doğru şekilde ayarlamanız gerekebilir). –

+0

"Ya da bağımlılıklarından biri" normal bir sorundur. Ne olabileceği hakkında bir fikriniz yoksa Fuslogvw.exe aracını kullanın. Ve doğru özel yolu ayarlamak için AppDomainSetup kullanın. –

cevap

11

İki hızlı puan:

  1. AppDomain.Load yükleri geçerli AppDomain içinde bir montaj değil myDomain üzerinde (garip, biliyorum).
  2. AppDomain.Load, Load bağlamında bir derlemeyi yükler; bu, derlemeleri uygulama taban dizininden, özel-bin yollarından ve GAC'den çözümler. Muhtemelen yüklemeye çalıştığınız derleme, istisna mesajını açıklayan bu konumların hiçbirinde bulunmuyor.

Daha fazla bilgi için bu answer'a bakın.

Bir AppDomain'e derlemeleri yüklemenin bir yolu, bir MarshalByRef türevli yükleyici oluşturmaktır. Ana Uygulama Alanınıza sızan türleri (ve montajları) önlemek için böyle bir şeye ihtiyacınız vardır.

public class SimpleAssemblyLoader : MarshalByRefObject 
{ 
    public void Load(string path) 
    { 
     ValidatePath(path); 

     Assembly.Load(path); 
    } 

    public void LoadFrom(string path) 
    { 
     ValidatePath(path); 

     Assembly.LoadFrom(path); 
    } 

    private void ValidatePath(string path) 
    { 
     if (path == null) throw new ArgumentNullException("path"); 
     if (!System.IO.File.Exists(path)) 
      throw new ArgumentException(String.Format("path \"{0}\" does not exist", path)); 
    } 
} 

Ve bu gibi kullanabilirsiniz: Burada basit biri

//Create the loader (a proxy). 
var assemblyLoader = (SimpleAssemblyLoader)myDomain.CreateInstanceAndUnwrap(typeof(SimpleAssemblyLoader).Assembly.FullName, typeof(SimpleAssemblyLoader).FullName); 
//Load an assembly in the LoadFrom context. Note that the Load context will 
//not work unless you correctly set the AppDomain base-dir and private-bin-paths. 
assemblyLoader.LoadFrom(pathToExe); 

//Do whatever you want to do. 

//Finally unload the AppDomain. 
AppDomain.Unload(myDomain); 
+0

Merhaba, belirli bir arabirim sınıfı uygulaması içerip içermediğini öğrenmek için önerinizi bazı .net montajlarına önceden yüklemeyi denedim. Ancak, derlemenin geçerli etki alanına yüklenmesinden farklı olarak, bunları yeni oluşturulan AppDomain etki alanım içine yükleyemiyorum. –

İlgili konular