gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:53:00 56 4
gpt4 key购买 nike

我有一个奇怪的问题。我想删除一个已经加载的程序集(硬盘上的 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/

56 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com