为什么清单中包含多个版本的引用DLL?

时间:2009-09-30 16:57:28

标签: .net crystal-reports reference assembly-resolution

我正在使用针对.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在机器上。在另一台机器上,它似乎工作正常。

1 个答案:

答案 0 :(得分:2)

经过大量的游戏,谷歌搜索和使用反射器后,我终于弄清楚这里发生了什么。

这个项目有一个DLL参考我们常见的框架DLL之一,它仍然使用10.x版本的Crystal报告DLL构建。因此,除了直接指向和引用的版本之外,似乎该版本的引用被添加到引用DLL的清单中。

当我使用11.5版本的Crystal二进制文件重建该公共DLL时,清单正确地仅列出了11.5版本。