我正在使用针对.Net 2.0的MSBuild v3.5构建.Net解决方案。
我们正在升级以使用Crystal 11.5,因此我更新了源代码控制树中的二进制文件,以包含11.5版本的DLL而不是10.0 DLL。
在项目中,我引用了一些Crystal Reports DLL。以下是项目文件的一个小例子:
<Reference Include="CrystalDecisions.ReportAppServer.ClientDoc, Version=10.0.3300.0, Culture=neutral, PublicKeyToken=692fbea5521e1304">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\Third Party\CrystalReports\CrystalDecisions.ReportAppServer.ClientDoc.dll</HintPath>
</Reference>
<Reference Include="CrystalDecisions.ReportAppServer.CommonControls, Version=10.0.3300.0, Culture=neutral, PublicKeyToken=692fbea5521e1304">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\Third Party\CrystalReports\CrystalDecisions.ReportAppServer.CommonControls.dll</HintPath>
</Reference>
但是,当我查看清单时,它显示ClientDoc被引用两次,即使它不在项目中两次:
.assembly extern CrystalDecisions.ReportAppServer.ClientDoc
{
.publickeytoken = (69 2F BE A5 52 1E 13 04 ) // i/..R...
.ver 11:5:3300:0
}
.assembly extern CrystalDecisions.ReportAppServer.ClientDoc as CrystalDecisions.ReportAppServer.ClientDoc_20
{
.publickeytoken = (69 2F BE A5 52 1E 13 04 ) // i/..R...
.ver 10:0:3300:0
}
我尝试修改项目中的引用以指定版本11.5.3300.0,并将SpecificVersion设置为True。这些都没有帮助,我仍然得到一个引用两个版本的清单。
为什么两个版本都包含在Manifest中?当使用相同的提示路径以相同的方式指定所有其他DLL时,为什么只有ClientDoc.DLL才会发生这种情况?
另外,如果以这种方式发货,哪个版本会先融合使用?似乎在我们测试的一台机器上,我们发现了一个错误,即没有找到10.0.3000.0版本... 11.5在机器上。在另一台机器上,它似乎工作正常。
答案 0 :(得分:2)
经过大量的游戏,谷歌搜索和使用反射器后,我终于弄清楚这里发生了什么。
这个项目有一个DLL参考我们常见的框架DLL之一,它仍然使用10.x版本的Crystal报告DLL构建。因此,除了直接指向和引用的版本之外,似乎该版本的引用被添加到引用DLL的清单中。
当我使用11.5版本的Crystal二进制文件重建该公共DLL时,清单正确地仅列出了11.5版本。