2012-04-25 7 views
4

si j'utiliseAssemblée de charge dans AppDomain

Assembly assembly = Assembly.LoadFrom(file); 

et essayez plus tard d'utiliser le fichier, je reçois une exception indiquant que le fichier est utilisé.

Je dois le charger sur un nouveau domaine d'application. Tout ce que je semble trouver est des exemples de la façon de créer une instance avec dans l'Assemblée, est-il un moyen de charger l'ensemble.

ce que je dois est à:

(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 est pas un problème

je juste ne peux pas trouver comment charger l'Assemblée dans une nouvelle AppDomin, seulement des exemples de create instance, ce qui me donne une instace de la classe de with dans la DLL.

J'ai besoin de tout.

comme dans cette question: un autre exemple d'instance Create.

Loading DLLs into a separate AppDomain

+0

Avez-vous regardé http://msdn.microsoft.com/en-us /library/25y1ya39.aspx ?? – rt2800

+1

Peut-être que cette réponse pourrait vous aider? http://stackoverflow.com/a/225355/747511 –

Répondre

2

Le scénario le plus multidomaine de base est

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

Appel ExecuteAssembly sur un domaine séparé est convienient mais n'offre pas la possibilité d'interagir avec le domaine lui-même. Il requiert également que l'assembly cible soit un exécutable et force l'appelant à un seul point d'entrée. Pour incorporer une certaine flexibilité, vous pouvez également passer une chaîne ou des arguments au fichier .exe.

J'espère que cela aide.

Extension: Essayez quelque chose comme ce qui suit puis

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); 

où le AppDomain peut être initilised comme suit

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

Est-ce ce dont vous avez besoin? – MoonKnight