作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个奇怪的问题。我想删除一个已经加载的程序集(硬盘上的 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/
我是一名优秀的程序员,十分优秀!