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

标签 c# .net assemblies

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

所以,我有一个库(不引用主应用程序)登录到我的网站,我将其编译为 .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/

相关文章:

javascript - 有什么方法可以覆盖后退按钮吗?

c# - 在 asp.net 中集成 OpenID 时出错

c# - Linq 使用正则表达式选择

c# - 加载同一程序集的多个版本

c# - 使用 AWS CDK 创建用于构建 Docker 镜像的 CodeBuild 项目

c# - 使用 C# 计算 XML 字符串的叶子

.net - 从托管代码执行CPU/GPU指令

c# - 套接字关闭 : when should I use SocketShutdown. 两者

ASP.NET - bin 目录与在 web.conf 中添加程序集

c# - 如何防止 EF4 动态加载所有程序集