C#使用AppDomain动态调用不定dll的函数

_

#### 前提

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

#### 大致功能要求

主程序,会动态调用不同版本dll的某个方法。

主程序,dll会有自己的app.config和其他config、数据库链接语句等,要求之间不会影响。

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

```c#

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" });// 调用方法

```

<!--more-->

上面的例子,一般情况下也够用了,依赖也会加载进来。

但使用到config时,就发现不太对,主程序和dll都有app.config,这会导致dll里面获取app.config时,获取到主程序的app.config内容。

若dll还有MyConfig.config时,会无法加载到配置文件。

查了一些资料,发现没有比较好的办法做处理。

当然你可以把config命名都改了,执行前自动拷贝,或者调整读取config的方法等。

但在我这边的项目是全部分开,并且能自启动的,所以这种情况下不太适用,就直接忽略过上面提到的方案。

#### AppDomain

那这种情况可以选择AppDomain

```c#

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。

关于Win Server SQLite 出现 unable to open database file 2021-08-20
Quartz.Net 的 MisFire 未执行则跳过执行 2021-08-20