8

更新:昨夜、これは一部のレポートが保存されているフォルダーを変更するには手間がかかりすぎると判断しました。ここでの回避策は、フォルダーの名前を変更し、必要なバッチジョブを実行してから、フォルダー名を元の名前に戻すことです。今日の残りと来週のすべてをこれに取り組んでいて、まだ何も見せることができないような気がします。私は、顧客に請求できない(年に1回だけ発生する)よりも、上司に反対することで地獄を捕まえたいと思っています。助けてくれたすべての人に感謝します、私は彼の頭の上にいくつかの匿名の仲間を助けてくれるあなたの意欲に謙虚です。この質問を「放棄」する方法はわかりませんが、それでも皆さんに小道具を提供します。昼食時によくある質問とコメントを読みます。ありがとうございました。

前任者が作成したac#アプリケーションをデバッグしようとしています。彼はプログラマーであり、私はシステム管理者です。おそらくそれが私が間違っているところです。

とにかく、アセンブリの1つを再コンパイルして、本番サーバーにデプロイする必要があります。コンパイルすると、次のエラーが発生します。

タイプ'Mcrcsip.Web.McrcsipWebExceptionBaseは、参照されていないアセンブリで定義されています。アセンブリ'Mcrcsip.Web、Version = 2.0.3266.28977、Culture = neutral、PublicKeyToken=c3de6c6abcdf794b'への参照を追加する必要があります。

私はたまたまそのアセンブリのコピーを持っていて、既存のアセンブリ(異なる公開鍵トークンを持つ2.0.0.0)への参照を削除し、それが要求しているアセンブリへの参照を追加すると、コンパイル時にこのエラーが発生しますメッセージ:

タイプ'Mcrcsip.Web.McrcsipWebExceptionBaseは、参照されていないアセンブリで定義されています。アセンブリ'Mcrcsip.Web、Version = 2.0.0.0、Culture = neutral、PublicKeyToken=8bbdde85caf008d0'への参照を追加する必要があります。

グーグルでこのエラーを検索すると(もちろん一般化されています)、「これがアセンブリ参照を追加する方法です...」という結果がたくさん表示されます。

このメリーゴーランドを降りるにはどうすればよいですか?

ソリューションのレイアウトは次のとおりです。

  • Mcrcsip.Amwa.Solution
    • http://amwa-test.internal.lan/
    • Mcrcsip.Amwa.Core
      • Mcrcsip.Aws.Bol
      • Mcrcsip.Common
      • Mcrcsip.Web
      • nunit.framework
      • システム
      • システム構成
      • System.Data
      • System.Enterpriseサービス
      • System.Web
      • System.Web.Services
      • System.XML
    • Mcrcsip.Amwa.CrFactory
      • CrystalDecisions.CrystalReports.Engine
      • CrystalDecisions.Enterprise.Framework
      • CrystalDecisions.Enterprise.InfoStore
      • CrystalDecisions.ReportSource
      • CrystalDecisions.Shared
      • CrystalDecisions.Web
      • Mcrcsip.Amwa.Core
      • Mcrcsip.Web
      • システム
      • システム構成
      • System.Data
      • System.Drawing
      • System.Web
      • System.XML
    • Mcrcsip.Amwa.PdfFormHandler
      • itextsharp
      • Mcrcsip.Amwa.Core
      • Mcrcsip.Web
      • システム
      • システム構成
      • System.Data
      • System.Web
      • System.Xml
    • Mcrcsip.Amwa.Web
      • Mcrcsip.Amwa.Core
      • Mcrcsip.Amwa.CrFactory
      • Mcrcsip.Amwa.PdfFormHandler
      • Mcrcsip.Aws.BOL
      • Mcrcsip.Common
      • Mcrcsip.SharePoint
      • Mcrcsip.Web
      • システム
      • システム構成
      • System.Data
      • System.EnterpriseServices
      • System.Web
      • System.Web.Services
      • System.XML
    • Mcrcsip.Amwa.WebControls
      • システム
      • System.Data
      • システム設計
      • System.Drawing
      • System.Web
      • System.Xml
    • Mcrcsip.Amwa.Setup
4

3 に答える 3

7

参照の不一致または:心配をやめてILDASMを愛する方法をどのように学んだか

アヘム、咳咳、

問題

ニック、

元の投稿を読み直すと、dllのバージョンの不整合の問題があることは明らかです。つまり、ソリューション内の少なくとも1つのプロジェクトはMcrcsip.WebバージョンXに依存し、ソリューション内の少なくとも1つのプロジェクトはMcrcsip.WebバージョンYに依存します[さらに悪いことに、Mcrcsip.WebバージョンYに依存するライブラリに依存します]。これらを追跡するのは困難で面倒な場合があります。

最後までスキップするには、推奨される解決策を参照してください。

どのように

この種の不整合は、次の場合に発生します。

  1. AはBとCに依存し、BはCに依存し、
  2. AとBは、もともとCver1に対して構築されています。
  3. Aは更新され、Cver2に対してビルドされます。

直感的に予想されることとは異なり、AをビルドするときにBが自動的に更新されてC ver 2を使用することはありません。正しくビルドするには、 AとBの両方が同じライブラリを参照する必要があります。したがって、AはC ver 1に準拠するか、Bを再構築してCver2に準拠する必要があります。

現在、これはどのプロジェクト構成でも発生する可能性があります。そのため、ソフトウェアをバージョン管理し[適切な署名/バージョン管理を行わないとこの問題は悪化すると考えています]、依存関係の更新が発生するたびにチーム内で適切に通信することが重要です。

また、ハードとソフトの2種類の依存関係参照があることも知っておく価値があります[実際には、これらは同じです。つまり、一方が他方の特殊なケースであることを除いて、dllへのリンクであり、概念的には2つを区別するのに役立ちます。 ]。

ハードリファレンス

ハードリファレンスは、プロジェクトの静的dllへの依存関係です。つまり、依存関係は特定の時間に作成され、その物理ファイルが新しいファイルに置き換えられない限り更新されません。ハード参照は、[参照の追加]ダイアログを介してソリューションに追加され、[。Net]、[COM]、または[参照]タブから参照を追加します。ハードリファレンスは通常、現在のソリューションの範囲外で開発されたソフトウェア(つまり、フレームワーク、サードパーティ、および他の内部チームによって開発された他のファーストパーティ製品)に依存関係を追加するために使用されます。ハードリファレンスは、独自の開発ストリームによって維持および更新されるため、古くなる傾向もあります。

上記のシナリオを想定します

  1. AはBとCに依存し、BはCに依存し、
  2. AとBは、もともとCver1に対して構築されています。
  3. Aは更新され、Cver2に対してビルドされます。

さらに、AとBが同じソリューション内にあると仮定します

  • SimpleSolution
    • A
      • B[ハードリファレンス]
      • Cv2[ハードリファレンス]
    • B
      • Cv1[ハードリファレンス]

Aがビルドされると、説明したエラーが発生します。AはCv2からのオブジェクトを想定していますが、BはC v1に強く依存しているため、C v1が最初にメモリにロードされ、衝突が発生します。Aはv2を予期し、v1を見つけます。それはあなたのエラーです。

この状況を解決するには、

  1. プロジェクトBのハードリファレンスCv1をCv2に更新します
  2. プロジェクトBの強制再構築
  3. プロジェクトAのハードリファレンスBを[新しく構築された]Bに更新します
  4. Aの強制再構築

ソフトリファレンス

ソフト参照は、同じソリューション内の別のプロジェクトへのプロジェクトの依存関係です。つまり、ソリューション全体が再構築されるたびに、依存関係が再構築されます。ソフト参照は、[参照の追加]ダイアログを介してソリューションに追加され、[プロジェクト]タブから参照を追加します。ソフト参照は通常、現在のソリューションの範囲内で開発されたソフトウェアに依存関係を追加するために使用されます。ソフト参照には、同じソリューション内のコンシューマーに対して行われる変更を伝播するという主な利点があります。この事実のおかげで、ソフト参照は古くなることはありません。

[これはハードリファレンスの特殊なケースです。VisualStudioは、ターゲットプロジェクトの出力パスを指す参照を追加します。ターゲットプロジェクトが出力構成を変更すると、このパスも更新されると思いますが、非常に便利な機能です。区別が必要]

上記のシナリオを想定します

  1. AはBとCに依存し、BはCに依存し、
  2. AとBは、もともとCver1に対して構築されています。
  3. Aは更新され、Cver2に対してビルドされます。

さらに、AとBが同じソリューション内にあると仮定します

  • SimpleSolution
    • A
      • B[ソフトリファレンス]
      • Cv2[ハードリファレンス]
    • B
      • Cv1[ハードリファレンス]

Aがビルドされると、説明したエラーが発生します。AはCv2からのオブジェクトを想定していますが、BはC v1に強く依存しているため、C v1が最初にメモリにロードされ、衝突が発生します。Aはv2を予期し、v1を見つけます。それはあなたのエラーです。

解決する、

  1. プロジェクトBのハードリファレンスCv1をCv2に更新します
  2. Aの強制再構築

ご覧のとおり、ソフト参照は保守が簡単です。

ILDASM [中間言語DisASeMbler]

参照とプロジェクトのメンテナンスについてもう少し理解できたので、ビルドの状態をどの程度正確に確認しますか?結局のところ、プロジェクトまたはそれらの依存関係のいずれかが矛盾している可能性があります。

簡単な方法は、ビルド出力ディレクトリを開き、ソリューションが生成したすべてのdllのアセンブリマニフェストを調べることです。

アセンブリのマニフェストを検査するには、

  1. 開いたildasm.exe
    • VS2010の場合、ildasmはショートカットから利用できます
    • VS2008およびVS2005の場合は、Visual Studioコマンドプロンプトを開き、コマンドラインから「ildasm」と入力します。
  2. dllを開き、
    • [ファイル]->[開く]をクリックするか、
    • Ctrl-Oを押す、または
    • dllをildasmウィンドウにドラッグアンドドロップします
  3. マニフェストを開く
    • MANIFESTというラベルの付いた赤い三角形のノードをダブルクリックします
  4. Mcrcsip.Webへの参照を見つける
    • [検索]をクリックして、ダイアログボックスにMcrcsip.Webと入力するか、
    • Alt-Fを押して、ダイアログボックスにMcrcsip.Webと入力するか、
    • マニフェストファイルの内容を手動で検査する
  5. バージョン番号を確認する

これは退屈で苦痛ですが、[重要な] dllの不整合エラーが発生した場合は、これがそれを見つける唯一の方法です。

推奨される解決策

  1. 該当する場合、ソリューションがソフト参照を使用していることを確認してください。
    • 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を開きます
  2. 該当する場合、ソリューションが新しいハードリファレンスを使用していることを確認してください。
    • 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を開きます
  3. 建てる

このステップでまだエラーが発生する場合は、1つまたはすべての

  • Mcrcsip.Aws.BOL
  • Mcrcsip.Common
  • Mcrcsip.SharePoint

Mcrcsip.Webへの依存関係を共有し、古いバージョンを参照しています。この場合、上記のハードリファレンスごとに

  1. 参照を選択
  2. F4を押す
  3. Pathプロパティからコンテンツをコピーします
  4. でファイルダイアログを開くildasm
  5. ファイル名に貼り付けます
  6. マニフェストを検査する

上記の3つのハードリファレンスのすべてに対してこれを行うようにしてください。これら3つのサブセットのどれが古いバージョンのMcrcsip.Webを参照しているかを特定すると、そのプロジェクトを見つけて、ハードリファレンスを更新、再構築して、最後にハードリファレンスを更新し、再構築して、出来上がります。ボブはあなたのおじです。

ふぅ。

ルフィン

冗長性についてのPSの謝罪。これはそれほど複雑な問題ではありませんが、あなたが同意すると確信しているように、それは多くの詳細を含みます。これがお役に立てば幸いです。ご協力ありがとうございます:)

PPSところで、私はあなたのコメントから、元の開発者がどこでも[つまり同じソリューション内でも]ハードリファレンスを使用したと推測しています。おそらく彼には理由がありましたが、イモ、それはお尻です。

于 2010-03-04T19:13:34.927 に答える
0

参照を右クリックしてプロパティに移動すると、「特定のバージョン」は何に設定されていますか?'True'に設定されており、リストされているバージョンが実際に2.0.xであることを確認してください。

プロパティページで、パスを再確認します。優先されているGACの他の場所に別のバージョンが登録されている可能性があります。コマンドラインで「gacutil-l」を使用して、そのアセンブリのすべての登録済みバージョンのリストを取得します。異なるキーで重複が見られる場合は、gacutilを使用して不要なキーを削除します。

于 2010-03-04T19:17:39.497 に答える
0

バッチビルドオプションで他のビルドを監視します。これにより、最初に構築するアセンブリに優先順位を付けることができ、次に依存関係は必要に応じて適切な順序でDLLを取得します。

于 2010-03-04T21:05:37.777 に答える