2015-11-04 26 views
5

.NETアプリケーションは、同じアセンブリの複数のバージョンをメモリに読み込むことができます。アセンブリは署名されませんが、アセンブリの新しいコピーがコンパイルされロードされるたびに、新しいアセンブリバージョン(マイナー部分)が自動的に取得されます。インスタンス化オブジェクトはコントロールによって管理されているので、型に関する問題はありません。そのため、オブジェクトがどのアセンブリから作成されているかが分かります。2つのバージョンのアセンブリがロードされたときにVisual Studio 2015で変数が評価されない

これはVS 2003以降で動作していましたが、最新のVS 2015ではこのシナリオのデバッグが壊れています。単一バージョンのアセンブリのみがメモリにロードされている間はすべて正常に動作しますが、2つ目のバージョンがロードされるときはいつでも、すべてのローカル/ウォッチウィンドウが空になります。 QuickWatchの式を評価しようとすると、コンパイラ例外が発生する "エラーCS1704:同じ単純名 'MyAssembly'を持つアセンブリが既にインポートされている。参照の1つ(「MyAssembly.dll」など)を削除するか、サイドバイサイドを有効にする。

VS2013デバッガ: VS2013 Debugger

VS2015デバッガ: VS2015 Debugger

ここで(2つのアセンブリがロードされる)VS2013とVS2015から取り付けデバッガと同じアプリケーションのスクリーンショットであります

そして、ロードされたアセンブリの選択された部品リスト: Two different versions of an assembly

だから、これはVS 2015でのデバッグがほとんど不可能になります。

元々これはコンパイラエラーです(私の考えはVS 2015デバッガのカバーの下で使用されています)。インターネット検索はあまり役に立ちません。ここに私が見つけることができたデバッガの問題に関連する唯一のリンクがあります: Visual Studio Debugger Failing to inspect variables。私の場合との違いは、メモリに2つのアセンブリがあるのは間違いだと私の場合はこれが意図であるということです。

今私は自分の選択肢について考えています。

  • もちろん、理想的にはVS 2015にパッチを適用して問題を解決したいと考えています。しかし、現実的な私はこれが起こるとは確信していません。 (コンパイラが示唆するように)アセンブリは、クライアントのマシン上で生成され、署名のための鍵とそれらを提供することはできないので
  • 署名アセンブリはオプションではありません。
  • アセンブリが異なるドメインに読み込まれたときに、デバッガがケースを処理できるかどうかをAppDomainsで調べることができます。しかし、可能であれば、これは私のアプリケーションへのかなりの(そして計画外の)変更になるでしょう。

他にもいくつかアイデアを提案できますか? Thnaks。

+1

私は既に回避策を見つけましたが、アセンブリに署名することはできません。クライアントが自分で作成して自分のアセンブリに署名するためにキーを提供する必要はありません(この目的のためだけに作成して使用することは簡単ですが)。これがあなたのクライアントに強制するよりも多くの要件であれば、アセンブリをロードする前にアセンブリに署名することさえ可能です。強力な名前ツール(sn.exe)を使用して、事実の後でアセンブリに署名することができます。 – PfhorSlayer

答えて

3

この問題の回避策を見つけました。 Visual Studioの "Debug - Options - General - レガシーC#とVB式評価ツールを使用する"オプションがあり、以前のデバッガの動作を復元できます。

enter image description here

このオプションは、異なるデバッガの問題のためにVS 2015 Known Issuesで説明したが、また説明した場合のために動作します。

私もMicrosoftにバグを提出しました。私は彼らがそれについて何かをするとは思わないが、ここにはlinkがある。

0

これはあなたの状況ではオプションであると仮定すると、あなたは、アセンブリをロードする前に、クラスまたは名前空間の名前を変更しようとすることができます。

アセンブリファイルを変更することができるライブラリがあります。http://www.codeproject.com/Articles/20565/Assembly-Manipulation-and-C-VB-NET-Code-Injection

このコースのは、実行時にアセンブリと型をロードしていることを前提としています。

+0

ルーカス、ありがとう。あなたが提案しているオプションは非常に合理的ですが、私にとっては受け入れられないようです。私は、クライアントアセンブリのプロセスを構築する上で、いくつかの制御を制限していますが、実際には干渉したくありません。クライアントアセンブリにはユーザーコードが含まれているため、ユーザーはアセンブリ後のハッキングを実行することができないことがあります。ですから、私はVSへのパッチを持っているか、デバッガが正しく動作するようにするアプリケーションのコードで何かをするのが好きです。 – user1921819

関連する問題