2

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

因此,我有一个登录到我的网站的库(不引用主应用程序),并且我已将其编译为 .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 时,加载的类缓存任何其他插件所需的所有信息,以最大限度地减少网站流量(作为静态类)。

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

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

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

谁能帮助我如何确保程序集只加载一次?

4

1 回答 1

0

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

于 2013-09-23T01:40:03.893 回答