参照の不一致または:心配をやめてILDASMを愛する方法をどのように学んだか
アヘム、咳咳、
問題
ニック、
元の投稿を読み直すと、dllのバージョンの不整合の問題があることは明らかです。つまり、ソリューション内の少なくとも1つのプロジェクトはMcrcsip.WebバージョンXに依存し、ソリューション内の少なくとも1つのプロジェクトはMcrcsip.WebバージョンYに依存します[さらに悪いことに、Mcrcsip.WebバージョンYに依存するライブラリに依存します]。これらを追跡するのは困難で面倒な場合があります。
最後までスキップするには、推奨される解決策を参照してください。
どのように
この種の不整合は、次の場合に発生します。
- AはBとCに依存し、BはCに依存し、
- AとBは、もともとCver1に対して構築されています。
- Aは更新され、Cver2に対してビルドされます。
直感的に予想されることとは異なり、AをビルドするときにBが自動的に更新されてC ver 2を使用することはありません。正しくビルドするには、 AとBの両方が同じライブラリを参照する必要があります。したがって、AはC ver 1に準拠するか、Bを再構築してCver2に準拠する必要があります。
現在、これはどのプロジェクト構成でも発生する可能性があります。そのため、ソフトウェアをバージョン管理し[適切な署名/バージョン管理を行わないとこの問題は悪化すると考えています]、依存関係の更新が発生するたびにチーム内で適切に通信することが重要です。
また、ハードとソフトの2種類の依存関係参照があることも知っておく価値があります[実際には、これらは同じです。つまり、一方が他方の特殊なケースであることを除いて、dllへのリンクであり、概念的には2つを区別するのに役立ちます。 ]。
ハードリファレンス
ハードリファレンスは、プロジェクトの静的dllへの依存関係です。つまり、依存関係は特定の時間に作成され、その物理ファイルが新しいファイルに置き換えられない限り更新されません。ハード参照は、[参照の追加]ダイアログを介してソリューションに追加され、[。Net]、[COM]、または[参照]タブから参照を追加します。ハードリファレンスは通常、現在のソリューションの範囲外で開発されたソフトウェア(つまり、フレームワーク、サードパーティ、および他の内部チームによって開発された他のファーストパーティ製品)に依存関係を追加するために使用されます。ハードリファレンスは、独自の開発ストリームによって維持および更新されるため、古くなる傾向もあります。
上記のシナリオを想定します
- AはBとCに依存し、BはCに依存し、
- AとBは、もともとCver1に対して構築されています。
- Aは更新され、Cver2に対してビルドされます。
さらに、AとBが同じソリューション内にあると仮定します
- SimpleSolution
- A
- B[ハードリファレンス]
- Cv2[ハードリファレンス]
- B
Aがビルドされると、説明したエラーが発生します。AはCv2からのオブジェクトを想定していますが、BはC v1に強く依存しているため、C v1が最初にメモリにロードされ、衝突が発生します。Aはv2を予期し、v1を見つけます。それはあなたのエラーです。
この状況を解決するには、
- プロジェクトBのハードリファレンスCv1をCv2に更新します
- プロジェクトBの強制再構築
- プロジェクトAのハードリファレンスBを[新しく構築された]Bに更新します
- Aの強制再構築
ソフトリファレンス
ソフト参照は、同じソリューション内の別のプロジェクトへのプロジェクトの依存関係です。つまり、ソリューション全体が再構築されるたびに、依存関係が再構築されます。ソフト参照は、[参照の追加]ダイアログを介してソリューションに追加され、[プロジェクト]タブから参照を追加します。ソフト参照は通常、現在のソリューションの範囲内で開発されたソフトウェアに依存関係を追加するために使用されます。ソフト参照には、同じソリューション内のコンシューマーに対して行われる変更を伝播するという主な利点があります。この事実のおかげで、ソフト参照は古くなることはありません。
[これはハードリファレンスの特殊なケースです。VisualStudioは、ターゲットプロジェクトの出力パスを指す参照を追加します。ターゲットプロジェクトが出力構成を変更すると、このパスも更新されると思いますが、非常に便利な機能です。区別が必要]
上記のシナリオを想定します
- AはBとCに依存し、BはCに依存し、
- AとBは、もともとCver1に対して構築されています。
- Aは更新され、Cver2に対してビルドされます。
さらに、AとBが同じソリューション内にあると仮定します
- SimpleSolution
- A
- B[ソフトリファレンス]
- Cv2[ハードリファレンス]
- B
Aがビルドされると、説明したエラーが発生します。AはCv2からのオブジェクトを想定していますが、BはC v1に強く依存しているため、C v1が最初にメモリにロードされ、衝突が発生します。Aはv2を予期し、v1を見つけます。それはあなたのエラーです。
解決する、
- プロジェクトBのハードリファレンスCv1をCv2に更新します
- Aの強制再構築
ご覧のとおり、ソフト参照は保守が簡単です。
ILDASM [中間言語DisASeMbler]
参照とプロジェクトのメンテナンスについてもう少し理解できたので、ビルドの状態をどの程度正確に確認しますか?結局のところ、プロジェクトまたはそれらの依存関係のいずれかが矛盾している可能性があります。
簡単な方法は、ビルド出力ディレクトリを開き、ソリューションが生成したすべてのdllのアセンブリマニフェストを調べることです。
アセンブリのマニフェストを検査するには、
- 開いた
ildasm.exe
- VS2010の場合、ildasmはショートカットから利用できます
- VS2008およびVS2005の場合は、Visual Studioコマンドプロンプトを開き、コマンドラインから「ildasm」と入力します。
- dllを開き、
- [ファイル]->[開く]をクリックするか、
- Ctrl-Oを押す、または
- dllを
ildasm
ウィンドウにドラッグアンドドロップします
- マニフェストを開く
- MANIFESTというラベルの付いた赤い三角形のノードをダブルクリックします
- Mcrcsip.Webへの参照を見つける
- [検索]をクリックして、ダイアログボックスにMcrcsip.Webと入力するか、
- Alt-Fを押して、ダイアログボックスにMcrcsip.Webと入力するか、
- マニフェストファイルの内容を手動で検査する
- バージョン番号を確認する
これは退屈で苦痛ですが、[重要な] dllの不整合エラーが発生した場合は、これがそれを見つける唯一の方法です。
推奨される解決策
- 該当する場合、ソリューションがソフト参照を使用していることを確認してください。
- Mcrcsip.Amwa.CrFactoryを展開します
- 参照を展開
- 参照Mcrcsip.Amwa.Coreを削除します
- [参照の追加]ダイアログを開きます
- [プロジェクト]タブからMcrcsip.Amwa.Coreを開きます
- Mcrcsip.Amwa.PdfFormHandlerを展開します
- 参照を展開
- 参照Mcrcsip.Amwa.Coreを削除します
- [参照の追加]ダイアログを開きます
- [プロジェクト]タブからMcrcsip.Amwa.Coreを開きます
- Mcrcsip.Amwa.Webを展開します
- 参照を展開
- 参照Mcrcsip.Amwa.Coreを削除します
- 参照Mcrcsip.Amwa.CrFactoryを削除します
- 参照Mcrcsip.Amwa.PdfFormHandlerを削除します
- [参照の追加]ダイアログを開きます
- [プロジェクト]タブからMcrcsip.Amwa.Coreを開きます
- [プロジェクト]タブからMcrcsip.Amwa.CrFactoryを開きます
- [プロジェクト]タブからMcrcsip.Amwa.PdfFormHandlerを開きます
- 該当する場合、ソリューションが新しいハードリファレンスを使用していることを確認してください。
- Mcrcsip.Amwa.Coreを展開します
- 参照を展開
- 参照Mcrcsip.Aws.Bolを削除します
- 参照Mcrcsip.Commonを削除します
- 参照Mcrcsip.Webを削除します
- [参照の追加]ダイアログを開きます
- [参照]タブからMcrcsip.Aws.Bolを開きます[常に場所を指定するのが最適です]
- [参照]タブからMcrcsip.Commonを開きます
- [参照]タブからMcrcsip.Webを開きます
- Mcrcsip.Amwa.CrFactoryを展開します
- 参照を展開
- 参照Mcrcsip.Webを削除します
- [参照の追加]ダイアログを開きます
- [参照]タブからMcrcsip.Webを開きます
- Mcrcsip.Amwa.PdfFormHandlerを展開します
- 参照を展開
- 参照Mcrcsip.Webを削除します
- [参照の追加]ダイアログを開きます
- [参照]タブからMcrcsip.Webを開きます
- Mcrcsip.Amwa.Webを展開します
- 参照を展開
- 参照Mcrcsip.Aws.Bolを削除します
- 参照Mcrcsip.Commonを削除します
- 参照Mcrcsip.SharePointを削除します
- 参照Mcrcsip.Webを削除します
- [参照の追加]ダイアログを開きます
- [参照]タブからMcrcsip.Aws.Bolを開きます
- [参照]タブからMcrcsip.Commonを開きます
- [参照]タブからMcrcsip.SharePointを開きます
- [参照]タブからMcrcsip.Webを開きます
- 建てる
このステップでまだエラーが発生する場合は、1つまたはすべての
- Mcrcsip.Aws.BOL
- Mcrcsip.Common
- Mcrcsip.SharePoint
Mcrcsip.Webへの依存関係を共有し、古いバージョンを参照しています。この場合、上記のハードリファレンスごとに
- 参照を選択
- F4を押す
- Pathプロパティからコンテンツをコピーします
- でファイルダイアログを開く
ildasm
- ファイル名に貼り付けます
- マニフェストを検査する
上記の3つのハードリファレンスのすべてに対してこれを行うようにしてください。これら3つのサブセットのどれが古いバージョンのMcrcsip.Webを参照しているかを特定すると、そのプロジェクトを見つけて、ハードリファレンスを更新し、再構築して、最後にハードリファレンスを更新し、再構築して、出来上がります。ボブはあなたのおじです。
ふぅ。
ルフィン
冗長性についてのPSの謝罪。これはそれほど複雑な問題ではありませんが、あなたが同意すると確信しているように、それは多くの詳細を含みます。これがお役に立てば幸いです。ご協力ありがとうございます:)
PPSところで、私はあなたのコメントから、元の開発者がどこでも[つまり同じソリューション内でも]ハードリファレンスを使用したと推測しています。おそらく彼には理由がありましたが、イモ、それはお尻です。