首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何删除AppDomain.Unload(域名)后的插件程序集

如何删除AppDomain.Unload(域名)后的插件程序集
EN

Stack Overflow用户
提问于 2009-01-08 17:10:38
回答 4查看 8.9K关注 0票数 18

我有个奇怪的问题。我想删除已加载的程序集(硬盘上的plugin.dll),但该程序集已被操作系统(vista)锁定,即使我已将其卸载。

f.e.

代码语言:javascript
复制
AppDomainSetup setup = new AppDomainSetup();
setup.ShadowCopyFiles = "true";
AppDomain appDomain = AppDomain.CreateDomain(assemblyName + "_AppDomain", AppDomain.CurrentDomain.Evidence, setup);
IPlugin plugin = (IPlugin)appDomain.CreateInstanceFromAndUnwrap(assemblyName,                        "Plugin.MyPlugins");

我还需要组装信息,因为我不知道插件组装中的哪些类实现了IPlugin接口。一个Pluginassembly中应该可以有多个插件。

代码语言:javascript
复制
Assembly assembly = appDomain.Load(assemblyName);
if (assembly != null) {
   Type[] assemblyTypes = assembly.GetTypes();
   foreach (Type assemblyTyp in assemblyTypes) {
      if (typeof(IPlugin).IsAssignableFrom(assemblyTyp)) {
         IPlugin plugin = (IPlugin)Activator.CreateInstance(assemblyTyp);
         plugin.AssemblyName = assemblyNameWithEx;
         plugin.Host = this;
      }
   }
}
AppDomain.Unload(appDomain);

如何才能在不锁定程序集的情况下从appDomain中获取程序集信息?

诚挚的问候

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-01-12 16:26:20

我想我有答案了!如果您想要删除已加载的程序集,来自yvind Skaar的答案将不起作用。

而不是

代码语言:javascript
复制
using (FileStream dll = File.OpenRead(path))
{
   fileContent = new byte[dll.Length];
   dll.Read(fileContent, 0, (int)dll.Length);
}
Assembly assembly = appDomain.Load(fileContent);

你必须使用

代码语言:javascript
复制
byte[] b = File.ReadAllBytes(assemblyName);
assembly = Assembly.Load(b);

诚挚的问候

票数 22
EN

Stack Overflow用户

发布于 2010-03-19 13:36:43

我知道这个帖子已经死了,但我目前正在做这个工作,我刚刚得到了答案(凌晨1点30分……)

代码语言:javascript
复制
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
AppDomain app = AppDomain.CreateDomain("YaCsi", null, setup);
app.DoCallBack(LoaderCallback);
AppDomain.Unload(app);
File.Delete("__YaCsi_Test01.dll");

static void LoaderCallback()
{
    byte[] raw = File.ReadAllBytes("__YaCsi_Test01.dll");
    Assembly yacsi = Assembly.Load(raw);
    ((IScript)yacsi.CreateInstance("Script")).Go();
}

它实际上不会抛出任何异常!希望有人会读到这篇文章,它会回答你的问题!

票数 8
EN

Stack Overflow用户

发布于 2009-01-11 15:50:05

如果将程序集作为流加载,它应该可以工作。

代码语言:javascript
复制
byte[] fileContent;
string path = "../../../test/bin/Debug/test.dll"; //Path to plugin assembly
using (FileStream dll = File.OpenRead(path))
{
   fileContent = new byte[dll.Length];
   dll.Read(fileContent, 0, (int)dll.Length);
}
Assembly assembly = appDomain.Load(fileContent);
File.Delete(path);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/425077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档