从几个插件载入程序集,但只载入一次

问题描述:

我正在为另一个强名称的应用程序开发插件,因此任何引用它的插件都需要为每个版本重新编译。从几个插件载入程序集,但只载入一次

所以,我有一个登录到我的网站库(不引用主应用程序),并且我编译它作为一个.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”条件中具有程序集== null并加载文件。然后它会得到该类型并调用CheckForUpdates方法。当调用CheckForUpdates时,加载的类会缓存所有其他插件所需的所有信息,以最大限度地减少网站流量(作为静态类)。

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

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

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

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

+0

我想通了它为什么不能获得类型。 GetType仅适用于从文件加载的程序集。 – Inrego 2013-03-14 12:43:49

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