使用AppDomain.CreateInstanceAndUnwrap创建类型为T的实例,然后提前绑定到类型为T的方法

时间:2011-06-14 22:05:04

标签: c#-4.0 appdomain dynamic-binding early-binding

在AppDomain.CreateInstanceAndUnwrap方法的MSDN文档中,它表示为注释

  

如果对由CreateInstanceAndUnwrap返回的类型为T1的对象的方法M进行早期绑定调用,并且该方法在程序集C中对类型为T2的对象的方法进行早期绑定调用与当前程序集或包含T1的程序集相比,程序集C被加载到当前应用程序域中。即使在DynamicMethod的主体或其他动态生成的代码中对T1.M()进行早期绑定调用,也会发生此加载。如果当前域是默认域,则在进程结束之前无法卸载程序集C.如果当前域尝试加载程序集C,则加载可能会失败。

(http://msdn.microsoft.com/en-us/library/3c4f1xde.aspx)

有没有人对上述说明有技术解释?为什么会这样?首次在对象上调用方法时是否完成了程序集依赖项查找?

1 个答案:

答案 0 :(得分:3)

当您创建对象的实例时,会调用程序集依赖项。

让我们分析假设情景。我们有2个DLL:Lib1和Lib2。 (Lib1使用Lib2中的方法)。

在我们的应用程序中,main方法如下所示:

Worker localWorker = new Worker();
localWorker.PrintDomain();

AppDomain ad = AppDomain.CreateDomain("New domain");
Worker remoteWorker = (Worker)ad.CreateInstanceAndUnwrap("Lib1","Lib1.Worker");
remoteWorker.PrintDomain();

程序集依赖性是在线检查:

Worker remoteWorker = (Worker)ad.CreateInstanceAndUnwrap("Lib1","Lib1.Worker");

例如,如果Lib2.dll不存在,我们将获得异常。