4

.Net2.0を対象とするMSBuildv3.5を使用して.Netソリューションを構築しています。

Crystal 11.5を使用するようにアップグレードしているため、ソース管理ツリーのバイナリを更新して、10.0DLLではなく11.5バージョンのDLLを含めました。

プロジェクトでは、いくつかのCrystalReportsDLLを参照しています。プロジェクトファイルの小さな例を次に示します。

<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>

しかし、マニフェストを見ると、プロジェクトに2回存在していなくても、ClientDocが2回参照されていることがわかります。

.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に設定しようとしました。どちらも役に立ちませんが、両方のバージョンを参照するマニフェストを取得します。

両方のバージョンがマニフェストに含まれているのはなぜですか?他のすべてのDLLが同じヒントパスで同じ方法で指定されている場合に、これがClientDoc.DLLでのみ発生するのはなぜですか?

また、この方法で出荷された場合、Fusionは最初にどのバージョンを使用しようとしますか?テストした1台のマシンで、バージョン10.0.3000.0が見つからなかったというエラーが発生する可能性があります...11.5がマシン上にありました。別のマシンでは、問題なく動作しているように見えました。

4

1 に答える 1

2

たくさん遊んだり、グーグルしたり、リフレクターを使ったりした後、私はついにここで何が起こっているのかを理解しました。

このプロジェクトには、CrystalレポートDLLの10.xバージョンでまだ構築されていた一般的なフレームワークDLLの1つへのDLL参照があります。したがって、そのバージョンの参照は、直接ポイントされて参照されているバージョンに加えて、参照しているDLLのマニフェストに追加されているようです。

その一般的なDLLを11.5バージョンのCrystalバイナリで再構築すると、マニフェストは11.5バージョンのみを正しくリストします。

于 2009-10-15T18:16:35.130 に答える