我正在开发一个框架,该框架允许在运行时动态加载插件,而无需直接引用它们的 DLL。插件在运行时动态实例化。但是,我面临插件之间依赖关系的问题。如果一个插件依赖于另一个插件,并且它们属于不同的程序集,那么我在尝试通过反射检索构造函数参数时会遇到问题。
具体来说,在检索构造函数参数时,我可能会遇到插件引用但框架无法识别的类型。这会导致在尝试加载这些类型时出现“找不到文件”等异常。即使我成功检索了插件的所有构造函数参数,使用 Activator.CreateInstance 仍然会因同样的原因抛出异常。
我尝试将插件及其依赖的 DLL 捆绑在一起,但这种方法会导致引用更新为合并的 DLL 中的内部引用。因此,不同程序集中引用的类型不再被识别为相同的类型。
如何解决这个问题?
我正在处理的问题是这样的:
// A.dll
public class PluiginA(IPluginB pluginB) : PluginController
{
...
}
// B.dll
public class PluiginB() : PluginController
{
...
}
public class Program
{
public static void Main() {
var assemblyA = Assembly.LoadFrom("pathToA.dll");
var classNameA = assemblyA.GetExportedTypes().FirstOrDefault(
x => x.BaseType == typeof(PluginController)));
var constructorA = classNameA.GetConstructors()[0];
// This line leads to System.IO.FileNotFoundException because PluginA's constructor parameters references a type from B.dll, and the framework cannot resolve it.
var parameterInfoA = constructorA.GetParameters();
}
}
您必须使用 AppDomain 来隔离代码执行,这将在您的进程/程序中设置额外的边界。
Stack Overflow 上有很多关于
AppDomain
的内容可供阅读。