在C#中当我们想使用动态反射调用时一般会写如下的方法来实现:前提条件是必须在本项目引用定义接口 "IRunnable"。

var asm = Assembly.LoadFile(@"C:\myDll.dll");
var type = asm.GetType("TestRunner");
var runnable = Activator.CreateInstance(type) as IRunnable;
if (runnable == null) throw new Exception("broke");
runnable.Run();

但是我想说的是以上并不是最优方法,为什么呢?在类型隔离性这样使用是有问题的,可能会造成冲突。正确的使用方法是引入 AppDomain,这样代码就改为如下:

var domain = AppDomain.CreateDomain("NewDomainName");
var t = typeof(TypeIWantToLoad);
var runnable = domain.CreateInstanceFromAndUnwrap(@"C:\myDll.dll", t.Name) as IRunnable;
if (runnable == null) throw new Exception("broke");
runnable.Run();

这样写的好处显而易见,一是容器隔离开了,配置也分开了,类型相互也不影响,二是它可以卸载了,灵活性大大增加了。但是还有一个问题必须说明,当存引入多个dll时,必须全部都加载进来再反射运行方法,否则你会得到一个错误。