我已经编写了一个可插拔的应用程序,可以将插件作为程序集加载。每个插件都读取一个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.
加载插件后,我将属性名称写入日志,插件将其属性读取两次。
这里是否发生了低级别的操作,我不明白?也许是指向同一个组件的指针,因为它们是完全相同的对象?
答案 0 :(得分:0)
您使用Activator.CreateInstanceFrom调用。在内部,它会调用Assembly.LoadFrom。如果您阅读Assembly.LoadFrom的文档,您将看到:
如果已加载具有相同标识的程序集,则即使指定了不同的路径,LoadFrom也会返回已加载的程序集。
因此,在装入程序集的第一个副本后,无论路径如何,同一程序集的所有后续加载都将返回第一个程序集。这也意味着Assembly.CodeBase属性(您最有可能用于获取xml配置文件的路径)也将返回第一个加载的程序集的路径,因此您的问题。