4

我正在使用面向 .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 上?

另外,如果这样发货,fusion会先尝试使用哪个版本?似乎在我们测试的一台机器上,我们可以发现没有找到版本 10.0.3000.0 的错误... 11.5 在机器上。在另一台机器上它似乎工作正常。

4

1 回答 1

2

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

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

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

于 2009-10-15T18:16:35.130 回答