gpt4 book ai didi

c# - AppDomain 卷影复制不起作用(原始程序集已锁定)

转载 作者:行者123 更新时间:2023-11-30 15:43:49 32 4
gpt4 key购买 nike

这是我用来探查可用插件列表的小类:

internal static class PluginDirectoryLoader
{
public static PluginInfo[] ListPlugins(string path)
{
var name = Path.GetFileName(path);
var setup = new AppDomainSetup
{
ApplicationBase = path,
ShadowCopyFiles = "true"
};
var appdomain = AppDomain.CreateDomain("PluginDirectoryLoader." + name, null, setup);
var exts = (IServerExtensionDiscovery)appdomain.CreateInstanceAndUnwrap("ServerX.Common", "ServerX.Common.ServerExtensionDiscovery");
PluginInfo[] plugins = null;
try
{
plugins = exts.ListPlugins(); // <-- BREAK HERE
}
catch
{
// to do
}
finally
{
AppDomain.Unload(appdomain);
}
return plugins ?? new PluginInfo[0];
}
}

path 参数指向包含要加载的插件程序集的子目录。这个想法是使用单独的 AppDomain 加载它们并启用卷影复制。

这种情况下,由于 AppDomain 卸载很快,所以影子复制并不是真正必要的,但是当我在我打算编写的下一个代码块中实际加载插件时,我想使用卷影复制,以便二进制文件可以即时更新。我已在此类中启用卷影复制作为测试,以确保我做的是正确的。

显然我没有做对,因为当我在代码示例中的注释行(即 plugins = exts.ListPlugins())中断调试器时,原始插件程序集被锁定通过应用程序!

鉴于我指定 AppDomain 加载的程序集应该被影子复制,为什么它们被应用程序锁定?

最佳答案

我想通了。 AppDomainSetup 中我错过了一个属性。该属性是 ShadowCopyDirectories

var setup = new AppDomainSetup
{
ApplicationBase = path,
ShadowCopyFiles = "true",
ShadowCopyDirectories = path
};

当中断我的问题中提到的行时,我现在可以删除插件程序集,即使不卸载 AppDomain。

关于c# - AppDomain 卷影复制不起作用(原始程序集已锁定),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6480140/

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