gpt4 book ai didi

c# - 在不锁定文件的情况下加载程序集并保持正确的绑定(bind)上下文

转载 作者:太空狗 更新时间:2023-10-29 20:18:18 26 4
gpt4 key购买 nike

我遇到了一个棘手的难题。这是我的情况:

我正在构建一个带有插件框架的应用程序。有一个所有插件都必须扩展的基本插件类。在同一个程序集中,我有一个帮助程序类,它将序列化和反序列化类。它是一个通用类,到处都在使用。结构是这样的:

MyApp.dll
|_ App.cs
|_ HelperCollection.cs
|_ PluginBase.cs

MyPlugin.dll
|_MyPlugin.cs (this extends PluginBase)
|_Foo.cs

问题

我的问题是程序集加载和锁定文件。该应用程序的要求是可以随时覆盖插件。如果是这样,则需要重新加载它们。这似乎是加载程序集使其不被锁定的最佳方式(也就是说,我可以在应用程序仍在运行时覆盖它或吹走它)是这样的:

byte[] readAllBytes = File.ReadAllBytes("MyPlugin.dll");
Assembly assembly = Assembly.Load(readAllBytes);

加载插件程序集工作正常,没有问题。当我在插件程序集的 MyPlugin.cs 中尝试使用 HelperCollection 进行反序列化时,出现异常。一个例子可能是这样的:

// HelperCollection uses XmlSerializer under the covers
List<Foo> settingCollection = HelperCollection<Foo>.Deserialize("mysettings.xml");

它正在爆炸并抛出一个 InvalidCastException 说它是 “无法将类型为 'List[Foo]' 的对象转换为 'List[Foo]'”。经过大量研究I finally found why .它正在加载到 LoadNeither binding context 中.

当加载 Foo 时(从 MyPlugin.dll)它在 LoadNeither 绑定(bind)上下文中,而程序集包含类型转换的类型(在我的例子中,MyApp.dll)在默认上下文中加载。因此,即使它们具有相同的名称,它们也不被视为同一类型。这样做是因为我正在使用 Assembly.Load(byte[])

问题

我该如何解决这个问题?我怎么能,

  1. 加载程序集而不锁定文件,并且
  2. 提供正确的绑定(bind)上下文,以便我可以转换位于已加载程序集中的对象。

抱歉文字墙,只是想获得所有相关信息。

最佳答案

你试过了吗shadow copying

当您使用影子复制时,.NET 将程序集复制到一个临时目录并从那里加载它(因此锁定的是临时文件,而不是原始程序集)——但所有绑定(bind)规则都基于原始文件位置。

关于c# - 在不锁定文件的情况下加载程序集并保持正确的绑定(bind)上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5267106/

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