2012-01-25 9 views
2

FxCopは、Crystal Reportsを参照してください。私が行うたびに、FxCopは "BusinessObjects.Licensing.KeycodeDecoder"という名前のアセンブリへの参照を見つけることができません。この.dllを見つける際に、私はそれがまったく存在しないことを認識するようになった。それはハードドライブやGACにはないが、自分のアプリケーション自体が実行され、レポートが正常に表示される。私があれば、しかし、.NETランタイム/ Fusionが、マニフェストからすべての参照アセンブリをロードするとは限りません。

.assembly extern BusinessObjects.Licensing.KeycodeDecoder 
{ 
    .publickeytoken = (69 2F BE A5 52 1E 13 04)       // i/..R... 
    .ver 13:0:2000:0 
} 

:あなたはILDASMでそれを開くと、いくつかの狩猟に私を導いたので

... CrystalDecisions.CrystalReports.Engine.dllファイルで

は、それはそのマニフェスト内の参照を含んでいますFusion Logger(fuslogvw)を開いてアプリケーションを実行すると、CrystalDecisions.CrystalReports.Engineを含むFusionのCrystalアセンブリがロードされますが、参照されたBusinessObjects.Licensing.KeycodeDecoderアセンブリはでロードされることはありません。

だから...なぜですか? .NETランタイムは、実行時にその参照をスキップするかどうかをどのように知っていますか?なぜFusionはすべての参照されたアセンブリを再帰的にロードしないのですか?私はちょうどそれの背後にいくつかの論理や推論や設計の意図を探しています...

おそらく同じように重要ですが、.NETプロジェクトは.dllへの参照を持つように作成できますが、これらの参照は強制されません。 IMOでは、SAPがインストールされていない他のアセンブリを参照するCrystalアセンブリを出荷することは間違っています。

答えて

2

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

アセンブリから型を要求しない限り、ロードする理由はありません。アセンブリは、コンフィグレーションファイル内のアセンブリ修飾型の名前など、クラスのTypeを取得するためだけにロードされることもあります。

+1

私はランタイムの観点からは理にかなっていると思います。静的なアナライザの観点からは、それはむしろ臭いものです... CrystalReportsを参照するアセンブリをFxCopするのは基本的に不可能です。少なくとも、コマンドラインFxCopでは、欠落している参照をスキップすることはできません。 – CodingWithSpike

0

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

関連する問題