关于C#中反射的问题:处理插件依赖关系

问题描述 投票:0回答:1

我正在开发一个框架,该框架允许在运行时动态加载插件,而无需直接引用它们的 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();
    }
}
c# reflection dll-dependency
1个回答
0
投票

您必须使用 AppDomain 来隔离代码执行,这将在您的进程/程序中设置额外的边界。

Stack Overflow 上有很多关于

AppDomain
的内容可供阅读。

StackOverflow - 什么是 AppDomain?

StackOverflow - C# 中 AppDomain 的使用

© www.soinside.com 2019 - 2024. All rights reserved.