2012-04-25 3 views
4

, если я используюСборка нагрузки в AppDomain

Assembly assembly = Assembly.LoadFrom(file); 

, а затем попробуйте использовать файл, я получаю исключение о том, что файл находится в использовании.

Мне нужно загрузить его на новый appdomain.

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

то, что мне нужно, чтобы:

(1) load the assembly into a new AppDomain from a file . 
(2) extract an embedded resource (xml file) from the Dll . 
(3) extract a type of class which implements an interface (which i know the interface type) . 
(4) unload the entire appdomain in order to free the file . 

2-4 не проблема

я просто не могу найти, как загрузить сборку в новую AppDomin, только примеры из создают экземпляр, который дает мне значение класса из с в Dll.

Мне нужно все.

как в этом вопросе: еще один пример создания экземпляра.

Loading DLLs into a separate AppDomain

+0

вы смотрели на http://msdn.microsoft.com/en-us /library/25y1ya39.aspx ?? – rt2800

+1

Возможно, этот ответ может вам помочь? http://stackoverflow.com/a/225355/747511 –

ответ

2

Самый основной мультидоменный сценарий

static void Main() 
{ 
    AppDomain newDomain = AppDomain.CreateDomain("New Domain"); 
    newDomain.ExecuteAssembly("file.exe"); 
    AppDomain.Unload(newDomain); 
} 

Вызов ExecuteAssembly на отдельном домене convienient, но не дает возможность взаимодействовать с самим доменом. Он также требует, чтобы целевая сборка была исполняемой и заставляла вызывающего абонента в одну точку входа. Чтобы включить некоторую гибкость, вы также можете передать строку или args в .exe.

Надеюсь, это поможет.

Расширение: Попробуйте что-то вроде следующего затем

AppDomainSetup setup = new AppDomainSetup(); 
setup.AppDomainInitializer = new AppDomainInitializer(ConfigureAppDomain); 
setup.AppDomainInitializerArguments = new string[] { unknownAppPath }; 
AppDomain testDomain = AppDomain.CreateDomain("test", AppDomain.CurrentDomain.Evidence, setup); 
AppDomain.Unload(testDomain); 
File.Delete(unknownAppPath); 

где AppDomain можно initilised следующим

public static void ConfigureAppDomain(string[] args) 
{ 
    string unknownAppPath = args[0]; 
    AppDomain.CurrentDomain.DoCallBack(delegate() 
    { 
     //check that the new assembly is signed with the same public key 
     Assembly unknownAsm = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(unknownAppPath)); 

     //get the new assembly public key 
     byte[] unknownKeyBytes = unknownAsm.GetName().GetPublicKey(); 
     string unknownKeyStr = BitConverter.ToString(unknownKeyBytes); 

     //get the current public key 
     Assembly asm = Assembly.GetExecutingAssembly(); 
     AssemblyName aname = asm.GetName(); 
     byte[] pubKey = aname.GetPublicKey(); 
     string hexKeyStr = BitConverter.ToString(pubKey); 
     if (hexKeyStr == unknownKeyStr) 
     { 
      //keys match so execute a method 
      Type classType = unknownAsm.GetType("namespace.classname"); 
      classType.InvokeMember("MethodNameToInvoke", BindingFlags.InvokeMethod, null, null, null); 
     } 
    }); 
} 
+0

Это то, что вам нужно? – MoonKnight