2010-03-11 3 views
2

J'ai une DLL d'assemblage .NET créée à la volée à partir d'un code pré-compilé dans une base de données. Y at-il un moyen de créer le fichier DLL, y mettre des données, le charger avec la classe Assembly, puis quand le processus se termine, cette DLL doit-elle être supprimée?Comment pouvez-vous obtenir une DLL à supprimer lorsque son processus propriétaire se termine?

Mes premiers réflexions étaient de l'ouvrir avec le drapeau FILE_SHARE_DELETE, de le charger avec Assembly.LoadFrom, et de le faire supprimer automatiquement.

Bien que LoadLibrary ouvre les fichiers avec l'indicateur FILE_SHARE_DELETE, lorsque la DLL est toujours mappée en mémoire, le système d'exploitation ne supprime pas le fichier. Ainsi, comment la DLL peut-elle être supprimée lorsque le processus se termine sans utiliser AppDomains ou en démarrant les exécutables externes «supprimer ce fichier après le processus cible» (les DLL .NET qui se chargent au moment de l'exécution dépendent de l'entrée de l'utilisateur). impliquer une sorte de communication de processus, que je voudrais éviter).

Répondre

0

Non, cela ne peut pas fonctionner. Le CLR crée une vue de fichier mappé en mémoire sur la DLL, il ne peut pas être supprimé tant que cette vue n'est pas détruite. Ce qui n'arrivera pas tant que l'AppDomain n'est pas déchargé. Puisque vous le chargez probablement dans l'AD primaire, cela n'arrivera pas jusqu'à ce que le programme arrête de fonctionner.

Un processus d'assistance qui démarre votre principal et supprime la DLL après son arrêt est à peu près tout ce que je peux penser si vous ne voulez pas utiliser un AD.

0

Si vous garder une trace de l'endroit où l'ensemble est compilé & sauvé, vous pouvez simplement utiliser File.Delete sur l'emplacement (situé à System.IO)

Questions connexes