Question

Je souhaite charger une ou plusieurs DLL de manière dynamique afin qu'elles s'exécutent avec une sécurité ou un chemin de base différent de celui de mon application principale. Comment charger ces DLL dans un domaine AppDomain distinct et instancier leurs objets?

Était-ce utile?

La solution

Plus spécifiquement

AppDomain domain = AppDomain.CreateDomain("New domain name");
//Do other things to the domain like set the security policy

string pathToDll = @"C:\myDll.dll"; //Full path to dll you want to load
Type t = typeof(TypeIWantToLoad);
TypeIWantToLoad myObject = (TypeIWantToLoad)domain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName);

Si tout se passe bien (aucune exception n'est levée), vous avez maintenant une instance de TypeIWantToLoad chargée dans votre nouveau domaine. L’instance dont vous disposez est en fait un proxy (puisque l’objet réel se trouve dans le nouveau domaine), mais vous pouvez l’utiliser comme votre objet normal.

Remarque: pour autant que je sache, TypeIWantToLoad doit hériter de MarshalByRefObject.

Autres conseils

Si vous ciblez la version 3.5, vous pouvez tirer parti du nouveau infrastructure d'extensibilité gérée . gérer tout le travail lourd pour vous.

Vous pouvez utiliser la méthode AppDomain.CreateInstance . . Vous devez appeler la méthode Unwrap de ObjectHandle qui est renvoyée pour obtenir l'objet réel.

Créez un nouvel Appdomain avec AppDomain.Create (...). Après avoir créé AppDomain, chargez les DLL dans cet AppDomain.

Recherchez toutes les méthodes d'Appdomain avec Create *. Il y a certaines choses comme CreateInstanceAndUnwrap, etc.

Comme indiqué précédemment, utilisez AppDomain.CreateDomain pour créer un nouveau domaine d'application. Vous pouvez ensuite charger un assembly dans celui-ci à l'aide de la méthode Load, ou même exécuter un assembly à l'aide de la méthode ExecuteAssembly. Vous pouvez utiliser GetAssemblies pour voir si un assembly a déjà été chargé. Sachez également que vous ne pouvez pas décharger un assemblage une fois qu'il est chargé. Vous devrez décharger le domaine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top