使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)