13

我正在尝试使用插件制作应用程序。

我有 MainLib.dll,我在其中ICommon使用 1 种方法制作了一些通用接口(让它成为)。然后,我制作了 2 个引用 MainLib.dll 并ICommon在某些类中实现的 .dll(插件)。另外,我删除了这个 .dlls exept 中的所有引用System

然后,我创建了一个应用程序,它监视文件夹".\\Plugins"并将所有 .dll 加载到 .dll 中newDomain,检查 .dll 中的类型是否实现ICommon(因此该应用程序也引用了 MainLib.dll)。如果是 - 在某个列表中添加 .dll 的名称。

现在问题出在这里:在我尝试加载插件之前 - 我将 MailLib.dll 和 System 加载到 newDomain,因为所有插件都依赖于这个 .dll。他们加载正确。然后,我开始加载插件,这里有:

FileNotFoundException,无法加载文件或程序集 'PluginWithException,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null' 或其依赖项之一。系统找不到指定的文件。)在字符串上 Assembly loadedAssembly = domain.Load(Assembly.LoadFrom(asm).FullName);

PluginWithException 程序集只有 2 个依赖项 - System 和 MainLib。在我尝试加载 PluginWithException 之前,我检查了新域中的程序集,System 和 MainLib 已加载到该域。所以我看不到任何依赖的问题。我阅读了这个主题,并尝试了解决方案,ProxyDomain但例外是相同的。

我做错了什么?

这里的代码:

public static List<string> SearchPlugins(string[] names)
{
    AppDomain domain = AppDomain.CreateDomain("tmpDomain");
    domain.Load(Assembly.LoadFrom(@".\MainLib.dll").FullName);
    domain.Load(@"System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
    MessageBox.Show(GetAssembies(domain)); // here I can see that System and MailLib exist in new domain

    List<string> plugins = new List<string>();

    foreach (string asm in names)
    {
        Assembly loadedAssembly = domain.Load(Assembly.LoadFrom(asm).FullName); // here I have exception

        var theClassTypes = from t in loadedAssembly.GetTypes()
                            where t.IsClass &&
                                  (t.GetInterface("ICommonInterface") != null)
                            select t;
        if (theClassTypes.Count() > 0)
        {
            plugins.Add(asm);
        }
    }
    AppDomain.Unload(domain);
    return plugins;
}
4

1 回答 1

2

你可能想告诉域从哪里加载你的程序集:

AppDomain domain = AppDomain.CreateDomain("tmpDomain", null, new AppDomainSetup { ApplicationBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins") });

但是,我不明白为什么要在当前(默认)域以及 tmpDomain 中加载程序集。

于 2013-05-05T01:24:59.957 回答