2

这一切都开始了,因为我试图FxCop分析我的程序集,它引用了Crystal Reports。每次我这样做时,FxCop 都找不到对名为“ BusinessObjects.Licensing.KeycodeDecoder”的程序集的引用。在试图找到这个 .dll 时,我开始意识到它根本不存在......它不在硬盘驱动器或GAC上,但我的应用程序本身运行并显示报告很好。

所以这让我开始了一些狩猎......

CrystalDecisions.CrystalReports.Engine.dll文件中,如果您在ILDASM中打开它,它确实在其清单中包含引用:

.assembly extern BusinessObjects.Licensing.KeycodeDecoder
{
  .publickeytoken = (69 2F BE A5 52 1E 13 04 )                         // i/..R...
  .ver 13:0:2000:0
}

但是,如果我打开 Fusion Logger (fuslogvw) 并运行我的应用程序,我可以看到 Fusion 加载了一堆 Crystal 程序集,包括那个CrystalDecisions.CrystalReports.Engine,但是甚至从未尝试BusinessObjects.Licensing.KeycodeDecoder加载引用的程序集。

所以为什么?.NET 运行时如何知道在运行时跳过或不加载该引用?为什么 Fusion 不递归地加载每个引用的程序集?我只是在寻找这一切背后的一些逻辑或推理或设计意图......

也许同样重要的是,为什么可以创建具有对 .dll 的引用的 .NET 项目,但没有强制执行这些引用?IMO,SAP可以运送引用其他甚至没有安装的程序集的 Crystal 程序集是错误的。

4

2 回答 2

2

它完全按需加载它们。清单用于定位正确的程序集(包括正确的版本、强名称等)。

只要没有人从程序集中请求一个类型,就没有理由加载它。请注意,程序集也可能只是为了获取Type一个类而被加载,例如通过配置文件中的程序集限定类型名称。

于 2012-01-25T19:57:35.670 回答
0

它只会在实际使用时加载程序集。因此,如果程序集中的代码从未真正执行过,则程序集将永远不会被加载或尝试加载。

于 2012-01-25T19:57:10.570 回答