gpt4 book ai didi

c# - 设置用于加载插件程序集的私有(private)路径

转载 作者:太空狗 更新时间:2023-10-30 01:27:49 27 4
gpt4 key购买 nike

我正在开发一个可以加载插件的应用程序。插件程序集位于我的应用程序主目录下的目录中。

看起来像这样:

MyAppFolder----------->ThePluginFolder----------------Assembly1----------------Dependency1

我的问题出现在 Dependency1(这是程序集 1 引用的程序集)。 CLR 找不到它。

我阅读了一些有关 Fusion 的资料,看来我可以通过使用 currentAppDomain.AppendPrivatePath 设置私有(private)路径来纠正这个问题。

但是,在.NET 4.0 的帮助中,他们说这个方法已经过时了。他们将我指向 AppDomainSetup,但我无法使用它来修改我当前的应用程序域。
有谁知道我还能做些什么来加载这些依赖项?

我考虑过的选项:

  1. 我可以手动循环遍历 Assembly1 的引用,如果我在插件文件夹中找到一个程序集,我可以手动加载它。 (似乎是我的最佳选择,但我想确保我没有遗漏任何东西)

  2. 我可以 Hook 我当前域的 AssemblyResolve 事件(但这甚至看起来很奇怪 -- 你返回一个值。这是否意味着它不是多播?我正在处理插件的一个方面(业务规则),如果我的应用程序的另一部分需要插件报告怎么办?我需要 1 个全局事件处理程序吗?

最佳答案

感谢大家的帮助。就我而言,我发现最好的办法是在我的主应用程序目录中找到插件。虽然我可以使用 Load() 或 LoadFrom() 将程序集加载到单独的目录中(并且它似乎可以工作),但我后来遇到了序列化问题(引用的程序集具有需要序列化和反序列化的类)。

我尝试使用 LoadFrom() 和 Load(),在 AssmblyName 参数中提供各种证据。我什至“手动”加载我的插件引用的程序集。再多的动态加载也无法使反序列化工作(我有异常(exception))。

我只找到了 3 种方法让我的动态加载插件与序列化一起工作:

  1. 使用 CurrentDomain.AppendPrivatePath 将路径添加到包含我的程序集的目录(此方法已过时)

  2. 在当前的 AppDomain 中挂接 ResolveAssembly 事件(这本来可以工作,但它被调用了很多,我不想影响我的应用程序的性能——请注意,我还没有进行测量) .

  3. 只需将程序集放在我的主目录中即可。 (这是最简单的解决方案,反对这样做的唯一理由是目录结构不像我的其他选择那样整洁。所以,考虑到所有因素。我选择了这条路线。

关于c# - 设置用于加载插件程序集的私有(private)路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2238837/

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