gpt4 book ai didi

c# - 单击一次应用程序释放对 MEF 获取的 dll 的锁定

转载 作者:行者123 更新时间:2023-11-30 17:50:34 25 4
gpt4 key购买 nike

如何在我的 ClickOnce 应用程序 (WPF) 中启用此类插件 dll 可以在运行时删除?

我找到了一个用这个做的旧演示。

private static void SetShadowCopy()
{
AppDomain.CurrentDomain.SetShadowCopyFiles();
AppDomain.CurrentDomain.SetCachePath(@"C:\MEF\PartUpdatesInPlace\PartUpdatesInPlace\bin\Debug\Cache");
}

但它会发出警告,指出它已过时,我应该使用其他东西,但我无法弄清楚如何在不执行上述操作时启用卷影复制。这两条线按预期工作。而且我看到有人在做一个 shell exe 应用程序来启动他真正的应用程序。我也不想要那个。

我假设一定有一种方法可以做到与上述相同但不使用过时的方法。

更新

        // Works
AppDomain.CurrentDomain.SetShadowCopyFiles();
AppDomain.CurrentDomain.SetCachePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\Cache\");

// Dont Work
AppDomain.CurrentDomain.SetupInformation.ShadowCopyFiles = "true";
AppDomain.CurrentDomain.SetupInformation.CachePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\Cache\";

不同之处似乎在于 SetShadowCopyFiles() 从它被调用的那一刻起就开始工作,因此当我在此调用之后设置 Mef 目录时,dll 工作并且我可以更新 dll 并执行 container.refresh() 而不会出现问题。

使用 SetupInformation 没有创建缓存文件夹并且 dll 被锁定。

更新2

给别人。到目前为止,这不适用于单击一次的应用程序。

最佳答案

根据 MSDN,SetShadowCopyFiles() 的替代方案是IAppDomainSetup.ShadowCopyFiles {get;set;}

您应该能够将它设置为 true 并提供相同的功能。

要使用它,请在 SetupInformation 上设置 ShadowCopyFiles 属性。 AppDomain.ShadowCopyFiles 是只读的。

AppDomain.CurrentDomain.SetupInformation.ShadowCopyFiles = "true";

编辑: 似乎在创建域后更改 SetupInformation 没有任何效果。

AppDomainSetup Class: Changing the properties of an AppDomainSetup instance does not affect any existing AppDomain. It can affect only the creation of a new AppDomain, when the CreateDomain method is called with the AppDomainSetup instance as a parameter.

除了继续使用过时的方法并冒 .NET 的下一次迭代可能会删除它们的风险之外,我不确定您现在应该如何做。

编辑 2: 我稍微尝试了一下,并使用 dotPeek 查看 AppDomain 对 ShadowCopyFiles 做了什么。我决定看看我是否可以通过反射来设置它。

您可能想尝试下面的方法,看看它是否满足您的需要。在 AppDomain 的内部 FusionStore 属性上将其设置为 true 会导致 AppDomain.ShadowCopyFiles 属性反射(reflect)更改,而在公开的 SetupInformation.ShadowCopyFiles 属性上设置它时并非如此.

var setupInfoProperty = AppDomain.CurrentDomain.GetType().GetProperty("FusionStore", BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.Instance);
var setupInfo = (AppDomainSetup) setupInfoProperty.GetValue(AppDomain.CurrentDomain);
setupInfo.ShadowCopyFiles = "true";
setupInfo.CachePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\Cache\";

关于c# - 单击一次应用程序释放对 MEF 获取的 dll 的锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20667915/

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