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

Posted

技术标签:

【中文标题】使用 AppDomain.CreateInstanceAndUnwrap 创建类型 T 的实例,然后提前绑定到类型 T 的方法【英文标题】:Using AppDomain.CreateInstanceAndUnwrap to create an instance of type T and then early binding to a method of type T 【发布时间】:2011-06-14 22:05:04 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

在创建对象实例时调用程序集依赖项。

让我们分析假设的场景。我们有 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 不存在,我们会得到一个异常。

【讨论】:

以上是关于使用 AppDomain.CreateInstanceAndUnwrap 创建类型 T 的实例,然后提前绑定到类型 T 的方法的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份