动态加载互为副本的不同程序集

本文关键字:程序集 副本 加载 动态 | 更新日期: 2023-09-27 18:12:33

我编写了一个可插入的应用程序,它将插件作为程序集加载。每个插件读取一个XML配置文件,该文件基本上具有不同的字符串设置。

一切工作正常与不同的插件,但我遇到奇怪的行为,当我复制和粘贴一个现有的插件程序集dll(但改变它的XML配置)。

Plugin A    |- PluginA.dll
            |- PluginA.xml
Plugin B    |- PluginB.dll
            |- PluginB.xml

加载了原始程序集(A)和复制的程序集(B),但似乎应用程序已经加载了完全相同的插件(B)两次。

我知道这是因为插件接口有一个名为'ApplicationName'的属性,该值是从适当插件的XML文件中读取的。每个插件都可以正确读取XML文件,属性值应该分别为'A'和'B'。

foreach (var pluginFile in LoadedPluginFiles) // 2 different plugin filenames
    {
       LogMessage("Loading plugin: " + pluginFile); // correct filename in loop
       ObjectHandle oHandle = Activator.CreateInstanceFrom(pluginFile, "MailboxMonitorPlugin.MailboxMonitorPlugin");
       MailboxMonitorPlugin.IMailboxMonitorPlugin pluginInfo = oHandle.Unwrap() as IMailboxMonitorPlugin;
       pluginInfo.Initialize(MailLink.Service.Properties.Settings.Default.PluginsPath);
       LogMessage("Plugin Application Name: " + pluginInfo.ApplicationName.ToString()); // Same application name (B) even though different file loaded in the loop.

加载插件后,我将属性名称写入日志,插件的属性读取两次。

这里是否有我不理解的低级操作?也许是指向同一个程序集的指针,因为它们是完全相同的对象?

动态加载互为副本的不同程序集

您使用Activator。CreateInstanceFrom电话。在内部,它将调用Assembly.LoadFrom。如果您阅读汇编的文档。LoadFrom,你会看到:

如果已经加载了具有相同标识的程序集,即使指定了不同的路径,LoadFrom也会返回加载的程序集。

因此,在加载程序集的第一个副本之后,同一程序集的所有后续加载,无论路径如何,都将返回第一个程序集。这也意味着大会。CodeBase属性(您最有可能使用它来获取xml配置文件的路径)也将返回第一个加载的程序集的路径,因此您的问题。