这一切都开始了,因为我试图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 程序集是错误的。