gpt4 book ai didi

c# - 加载依赖于另一个域的程序集时出现 FileNotFound

转载 作者:可可西里 更新时间:2023-11-01 08:46:16 25 4
gpt4 key购买 nike

<分区>

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

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

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

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

FileNotFoundException, Could not load file or assembly 'PluginWithException, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.) on string Assembly loadedAssembly = domain.Load(Assembly.LoadFrom(asm).FullName);

PluginWithException 程序集只有 2 个依赖项 - System 和 MainLib。在尝试加载 PluginWithException 之前,我检查了新域中的程序集,System 和 MainLib 已加载到该域。所以我看不到任何依赖问题。我读了this主题,并尝试使用 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;
}

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com