Déchargement de l'Assemblée chargée de l'Assemblée.LoadFrom()
J'ai besoin de vérifier le temps d'exécuter GetTypes() après le chargement de la dll.
Le code est comme suit.
Assembly assem = Assembly.LoadFrom(file);
sw = Stopwatch.StartNew();
var types1 = assem.GetTypes();
sw.Stop();
double time1 = sw.Elapsed.TotalMilliseconds;
J'aimerais déchargez et rechargez le fichier dll pour vérifier le temps à consacrer à l'exécution de GetTypes() de nouveau.
- Comment puis-je décharger?
assem = null
est assez bon? - Est-il de manière explicite à l'appel du garbage collector pour récupérer les ressources allouées à l'assemblée?
- Réponse courte est que vous ne pouvez pas décharger Assemblées; vous ne pouvez décharger les domaines d'application. Il y a un certain nombre de limitations imposées lorsque vous chargez un Assemblage dans un nouveau domaine d'application, donc je vous recommande de faire quelques recherches sur le sujet pour avoir une idée de comment ils fonctionnent. Cela dit, vous pouvez charger la même Assemblée, même si l'on n'a pas été déchargé.
- Quelqu'un a essayé ce qui se passe pour les assemblées si vous null eux ? Ils l'obtiennent ordures collectées ou libéré de toute façon ? Je m'inquiète de la mémoire.
- Un très related post ici.
Vous devez vous connecter pour publier un commentaire.
Malheureusement vous ne pouvez pas décharger une assemblée une fois qu'il est chargé. Mais vous pouvez décharger un domaine d'application. Ce que vous pouvez faire est de créer un nouveau domaine d'application (domaine d'application.CreateDomain(...) ), charger l'assembly dans ce domaine d'application pour travailler avec elle, puis de décharger le domaine d'application en cas de besoin. Lors du déchargement, le domaine d'application, toutes les assemblées qui ont été chargées sera déchargé. (Voir référence)
D'appeler le garbage collector, vous pouvez utiliser
GC appelle les finaliseurs dans un thread d'arrière-plan, c'est pourquoi vous avez à attendre et appeler à frais virés() à nouveau pour vous assurer que vous avez supprimé tout.
Pouvez-vous utiliser un autre domaine d'application?
Au lieu d'utiliser
LoadFrom()
ouLoadFile()
vous pouvez utiliserLoad
avecFile.ReadAllBytes()
. Avec cela, il n'utilise pas le fichier d'assemblage, mais allez la lire et la lecture de données.Votre code va ressembler à
De ici On ne peut pas décharger le fichier, sauf si tous les domaines contenus sont déchargés.
Espère que cette aide.:)
Assembly.LoadFrom()
. J'ai édité ton post, mais quelqu'un l'a changé en arrière.Assembly.Load
et pasAssembly.LoadFrom
plus.assem
est mis à null?Vous ne pouvez pas décharger assemblée à partir de l'actuel domaine d'application. Mais vous pouvez créer un nouveau domaine d'application, la charge de sous-ensembles en elle, d'exécuter du code à l'intérieur de nouveau domaine d'application, puis le décharger. Consulter le lien suivant: MSDN
Assemblée ne peut pas être déchargé malheureusement, et en outre, si vous utilisez domaines d'application - il va vous empêcher de communiquer avec l'api /assemblées de l'application principale.
Meilleure description du problème peut être trouvée ici:
Script D'Hébergement D'Orientation
http://www.csscript.net/help/Script_hosting_guideline_.html
Si vous souhaitez exécuter le code C# sans communication principale de votre application, puis la meilleure approche est d'intégrer le C# scripting API:
https://github.com/oleg-shilo/cs-script/tree/master/Source/deployment/samples/Hosting/Legacy%20Samples/CodeDOM/Modifying%20script%20without%20restart
Et d'intégration, vous aurez besoin des paquets suivants:
C# script:
http://www.csscript.net/CurrentRelease.html
Extension de Visual studio:
https://marketplace.visualstudio.com/items?itemName=oleg-shilo.cs-script
Cependant, si vous voulez communiquer à partir de votre C# script pour votre application puis en utilisant le même domaine d'application avec le nom de l'assembly en constante évolution est le seul moyen pour le moment - mais qui, malheureusement, mange de ram et d'espace disque.
Exemple de Code comment le faire peut être fait peut être trouvé ici:
https://github.com/tapika/cppscriptcore
CsScriptHotReload.la sln
Et voici la vidéo de démonstration:
https://drive.google.com/open?id=1jOECJj0_UPNdllwF4GWb5OMybWPc0PUV
Si vous ne souhaitez charger du montage initial sans qu'aucun de ses assemblées dépendantes, vous pouvez utiliser
Assembly.LoadFile
dans un domaine d'application, puis de décharger le domaine d'application lorsque vous avez terminé.Créer une classe loader pour charger et de travailler avec l'assemblée:
Exécuter le chargeur dans un autre domaine d'application comme ceci: