前提

最近来了一个动态调用DLL的一个任务,记录下用到的方式

大致功能要求

主程序,会动态调用不同版本dll的某个方法。
主程序,dll会有自己的app.config和其他config、数据库链接语句等,要求之间不会影响。

一听,不就是反射嘛,直接上反射。

Assembly ass = Assembly.LoadFrom(@"C:KaGaMi.dll");// dll路径
Type type = ass.GetType("KaGaMi.Class1"); // 获取该dll中命名空间类
object obj = Activator.CreateInstance(type);// 实例化该类
MethodInfo mStudyMath = type.GetMethod("Method");// 获取该类中的方法
var result = mStudyMath.Invoke(obj, new object[] { "Test" });// 调用方法

上面的例子,一般情况下也够用了,依赖也会加载进来。
但使用到config时,就发现不太对,主程序和dll都有app.config,这会导致dll里面获取app.config时,获取到主程序的app.config内容。
若dll还有MyConfig.config时,会无法加载到配置文件。

查了一些资料,发现没有比较好的办法做处理。
当然你可以把config命名都改了,执行前自动拷贝,或者调整读取config的方法等。
但在我这边的项目是全部分开,并且能自启动的,所以这种情况下不太适用,就直接忽略过上面提到的方案。

AppDomain

那这种情况可以选择AppDomain

var setup = new AppDomainSetup();
setup.ApplicationBase = appDirectory;
setup.LoaderOptimization = LoaderOptimization.SingleDomain;
setup.ApplicationName = "AppDomainTest";
setup.ShadowCopyFiles = "true";
setup.ShadowCopyDirectories = setup.ApplicationBase;

AppDomain appDomain = AppDomain.CreateDomain("AppDomainTest", null, setup);

var obj = appDomain.CreateInstance(mainNamespaceName, classPaeh);
var item = obj.Unwrap() as Class2;

注:目前. Net 5 不支持AppDomain。我这边项目是FW,就只考虑FW。

Q.E.D.


随意游世