动态加载彼此副本的不同程序集

时间:2015-09-14 08:42:58

标签: c# .net reflection .net-assembly

我已经编写了一个可插拔的应用程序,可以将插件作为程序集加载。每个插件都读取一个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.

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

这里是否发生了低级别的操作,我不明白?也许是指向同一个组件的指针,因为它们是完全相同的对象?

1 个答案:

答案 0 :(得分:0)

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

  

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

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