2

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

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

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

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

4

1 回答 1

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 不存在,我们将得到一个异常。

于 2011-10-25T12:01:39.437 回答