5

私の C# プロジェクトには、2 つのサードパーティ DLL への参照があります。これは、ソース コードにアクセスできず、これら 2 つの DLL を変更または再コンパイルできないことを意味するため、重要です。

それらを dll A と dll B と呼びましょう。dll A は次のようになります。

namespace ThirdParty.Foo
{
  public class Bar
  {
    ...snip...
  }

  public class Something
  {
    public Bar MyProperty { get; set; }
  }
}

dll B は次のようになります。

namespace ThirdParty.Foo
{
  public class Bar
  {
    ...snip...
  }

  public class SomethingElse
  {
    public Bar MyProperty { get; set; }
  }
}

ご覧のとおり、これらは同じ名前空間を持ち、両方とも同じ名前のクラスを定義しています。私の C# コードには、両方の DLL への参照が必要です。参照でエイリアス プロパティを使用して、2 つの参照を区別できるようにします。また、C# ファイルの先頭でも使用extern alias firstDllし ます。extern alias secondDllここまでは順調ですね。

Something.MyPropertyの型が firstDll.ThirdParty.Foo.Bar であり、の型が secondDll.ThirdParty.Foo.Bar であることは明らかですSomethingElse.MyPropertyが、何らかの理由で Visual Studio が混乱し、両方のプロパティの型を同じBarクラスに解決します最初のDll.

VisualStudio に正しい型を「強制的に」解決させる方法はありますか?

編集: Visual Studio で発生するエラーは次のとおりです: タイプ 'ThirdParty.Foo.Bar [d:\MySolution\References\Second.dll]' を 'ThirpParty.Foo.Bar [d:\MySolution\References] に暗黙的に変換できません\First.dll]'

4

6 に答える 6

1

ここでは、2 つのアセンブリの名前空間が同じであるだけでなく、完全なアセンブリ名も同じであるという極端なケースがあるため (型が同じアセンブリ修飾名を持っていることを意味します)、それを解決するためのより極端な手段を検討することをお勧めします。それが完全に管理された DLL (ネイティブ コードが混在していない) であり、厳密な名前が付けられていない (または厳密な名前を削除しても問題ない) 場合は、次のような手順で回避できる場合があります。

  1. ildasmを実行し、ディスク上の .il ファイルに出力します。
  2. 慎重な検索と置換を使用して .il ファイルを変更し、すべての型のルート名前空間を変更します (ルート名前空間と同じテキストを含む内部名前空間または型名には注意してください)。
  3. 変更したファイルをilasmで実行して、変更を加えた新しい .dll をビルドします。
于 2013-08-08T13:26:12.840 に答える