2

これはすべて、 Crystal Reportsを参照するアセンブリをFxCopで分析しようとしているために始まりました。私がそうするたびに、FxCop は " " という名前のアセンブリへの参照を見つけることができません。この .dll を見つけようとして、まったく存在しないことに気付きました...ハード ドライブやGACにはありませんが、アプリケーション自体は正常に実行され、レポートが表示されます。BusinessObjects.Licensing.KeycodeDecoder

それが私をいくつかの狩りに導きました...

この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、インストールさえされない他のアセンブリを参照する Crystal アセンブリをSAPが出荷できるのは間違っています。

4

2 に答える 2

2

純粋にオンデマンドでロードします。マニフェストは、正しいアセンブリ (正しいバージョン、厳密な名前などを含む) を見つけるために使用されます。

アセンブリから型を要求する人がいない限り、それを読み込む理由はありません。Typeアセンブリは、たとえば、構成ファイル内のアセンブリ修飾型名を介して、クラスのを取得するためだけに読み込まれる場合があることに注意してください。

于 2012-01-25T19:57:35.670 に答える
0

実際に使用されるときにのみアセンブリをロードします。そのため、アセンブリ内のコードが実際に実行されない場合、アセンブリが読み込まれたり、読み込まれようとしたりすることはありません。

于 2012-01-25T19:57:10.570 に答える