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

时间:2013-03-13 00:13:27

标签: 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时,加载的类会缓存任何其他插件所需的所有信息,以最大限度地减少网站流量(作为静态类)。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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