Bonjour,
Je n'arrive pas à utiliser les domaine d'application en C#.
Mon application utilise de nombreuse dll. dont certaines constituent des extensions de l'application principale. Le problèmes est que ces dll ont parfois des références en commun mais avec des versions différentes.
Donc pour éviter tout problèmes, j'ai pensé à charger ces dll dans des domaines d'applications différents.
Au cours de mes investigations, je suis tombé sur ce tuto : http://vincentlaine.developpez.com/t...domain/csharp/
cependant, je n'y arrive toujours pas
Comme indiqué, j'ai composé mon affaire en 3 étapes :
- L'appli principale créé un nouveau AppDomaine
- On cré dans ce nouveau domaine une instance d'un objet que j'ai nommé AssemblyLoader qui sera chargé de chargé les dll dans le nouveau domaine d'application
- Via le Loader, on charge les dll dans le nouveau domaine et on récupère une instance de l'objet désiré.
Voici le code de l'appel dans l'appli principale
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 // Creation of the domain app AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation; setup.ApplicationBase = filesManager.BinFolderAbsolutePath; setup.PrivateBinPath = filesManager.BinFolderAbsolutePath; setup.ShadowCopyFiles = "false"; string appDomName = "Extension_" + Guid.NewGuid(); AppDomain newExtension = AppDomain.CreateDomain(appDomName, null, setup); // Create Loader for assembly string loaderPath = Path.Combine(filesManager.BinFolderAbsolutePath, "AssemblyLoader.dll"); object tmp = newExtension.CreateInstanceFromAndUnwrap(loaderPath, "AssemblyLoader.AssemblyLoader"); AssemblyLoader.AssemblyLoader loader = tmp as AssemblyLoader.AssemblyLoader; // Load IExtension object result = null; if (loader != null) { string assemblyPath = Path.Combine(filesManager.BinFolderAbsolutePath, "Extension.dll"); result = loader.CreateInstanceOf(assemblyPath, typeof(IExtension)); }
Déjà ça plante dés le début avec mon objet tmp. quand j'exécute pas à pas mon programme, les attributs de l'objet tmp qui est un {System.Runtime.Remoting.Proxies.__TransparentProxy}
ne contiennent que des erreurs ou plus exactement des piles d'appels.
Par exemple l'attribut __identity contient
Mais le problème apparaît sûrement plus haut, car si je regarde l'objet AppDomain newExtension, lui aussi ses attributs sont remplis d'erreurs... comme l'attribut AssemblyLoad (exemple ci-dessous).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 System.Runtime.Remoting.RemotingException: Remoting cannot find field '__identity' on type 'System.MarshalByRefObject'. at System.Object.GetFieldInfo(String typeName, String fieldName) at System.Object.FieldGetter(String typeName, String fieldName, Object& val) at System.Object.FieldGetter(String typeName, String fieldName, Object& val) at System.RuntimeFieldHandle.GetValue(Object instance, RuntimeTypeHandle fieldType, RuntimeTypeHandle declaringType, Boolean& domainInitialized) at System.Reflection.RtFieldInfo.InternalGetValue(Object obj, Boolean doVisibilityCheck, Boolean doCheckConsistency) at System.Reflection.RtFieldInfo.GetValue(Object obj) at Microsoft.Office.Tools.Debugger.Tools.TryCreateDebuggerItem(MemberInfo member, Object target, __Item& item) System.Runtime.Remoting.RemotingException
En fait à l'exception des champs que je remplis à la main, tous contiennent des erreurs de ce genre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 AssemblyLoad : System.Runtime.Remoting.RemotingException: Remoting cannot find field 'AssemblyLoad' on type 'System.AppDomain'. at System.Object.GetFieldInfo(String typeName, String fieldName) at System.Object.FieldGetter(String typeName, String fieldName, Object& val) at System.Object.FieldGetter(String typeName, String fieldName, Object& val) at System.RuntimeFieldHandle.GetValue(Object instance, RuntimeTypeHandle fieldType, RuntimeTypeHandle declaringType, Boolean& domainInitialized) at System.Reflection.RtFieldInfo.InternalGetValue(Object obj, Boolean doVisibilityCheck, Boolean doCheckConsistency) at System.Reflection.RtFieldInfo.GetValue(Object obj) at Microsoft.Office.Tools.Debugger.Tools.TryCreateDebuggerItem(MemberInfo member, Object target, __Item& item) System.Runtime.Remoting.RemotingException
En espérant que quelqu'un puisse m'aider
Ikit
Partager