gpt4 book ai didi

c# - 从多个插件加载程序集,但只加载一次

转载 作者:太空宇宙 更新时间:2023-11-03 16:17:27 24 4
gpt4 key购买 nike

我正在为另一个强命名的应用程序开发插件,因此任何引用它的插件都需要为每个版本重新编译。

所以,我有一个库(不引用主应用程序)登录到我的网站,我将其编译为 .dll

这是我在每个插件中用于登录和检查更新的代码:

var managerAssemblyPath = "Path to the .dll assembly";
var assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.FullName.Equals("AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"));
if (assembly == null)
{
var assemblyBuffer = File.ReadAllBytes(managerAssemblyPath);
assembly = Assembly.Load(assemblyBuffer);
}
var t = assembly.GetType("Namespace.Class");
if (t == null)
{
var assemblyBuffer = File.ReadAllBytes(managerAssemblyPath);
assembly = Assembly.Load(assemblyBuffer);
t = assembly.GetType("Namespace.Class");
}
var methods = t.GetMethods();
var method = methods.Where(m => m.Name.Equals("CheckForUpdates")).ToArray()[1];
method.Invoke(null, new object[] { this.Id });

它确实完成了工作。正在加载的第一个插件将在第一个“if”条件中包含 assembly == null 并加载文件。然后它将获取类型并调用 CheckForUpdates 方法。当调用 CheckForUpdates 时,加载的类缓存任何其他插件所需的所有信息,以最大限度地减少网站流量(作为静态类)。

下一个插件通过全名找到程序集,但没有找到类型。因为它没有找到类型,所以它再次加载程序集。这就是问题所在。因为它再次加载程序集,所以它没有使用第一个插件缓存的信息,而是再次登录网站。

所以安装了 5 个插件,它登录网站 5 次,这不是很理想。

我更愿意从 dll 中读取字节,然后加载字节,因为这样文件就不会被锁定,而且通常我会运行应用程序的许多实例。

任何人都可以帮助我如何确保程序集只加载一次吗?

最佳答案

.Net 根据包含程序集路径的证据加载程序集。从字节流加载程序集会绕过验证过程的该步骤,因此 .Net 将每个加载的实例视为一个单独的沙盒实例,这会导致很多不愉快。

关于c# - 从多个插件加载程序集,但只加载一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15374705/

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