c# - 如何在 AppDomain.Unload(domain) 之后删除 pluginassembly

标签 c# plugins assemblies

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

现在

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");

我还需要程序集信息,因为我不知道 pluginassembly 中的哪些类实现了 IPlugin 接口(interface)。一个 Pluginassembly 中应该可以有多个 Plugin。

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 获取程序集信息?

最好的问候

最佳答案

我想我找到了答案! 如果您想删除加载的程序集,Øyvind Skaar 的回答将不起作用。

代替

using (FileStream dll = File.OpenRead(path))
{
   fileContent = new byte[dll.Length];
   dll.Read(fileContent, 0, (int)dll.Length);
}
Assembly assembly = appDomain.Load(fileContent);

你必须使用

byte[] b = File.ReadAllBytes(assemblyName);
assembly = Assembly.Load(b);

最好的问候

关于c# - 如何在 AppDomain.Unload(domain) 之后删除 pluginassembly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/425077/

相关文章:

c# - 以 WebAPI 和 MVC 作为客户端架构的 Restful 服务

c# - 如何在 HtmlHelper.Action(string, string, object) 中指定调用哪个 Controller 的 namespace ?

windows - Knife 窗 : Network Error: getaddrinfo: Name or service not known (windows:22)

jquery - 如何 iframe 。内容窗口。文档 。 execCommand 工作?

c# - Assembly.GetTypes() - ReflectionTypeLoadException

c# - CodeDom ReferencedAssemblies 绝对路径

c# - C# 中的异步修饰符

c# - 以编程方式调用 C# 编译器来编译 C# 代码

visual-studio - 推荐的 Microsoft Visual Studio 附加组件/插件

c# - 动态替换 C# 方法的内容?