2017-03-09 17 views
0

私は、別の人が開発した分離したdllで特定の型を使用するアプリケーションを持っています。今までアセンブリの動的読み込み時に名前空間を変更する

namespace SeparatedAssembly 
{ 
    public class InnerType 
    { 

    } 
} 

、私は、Visual StudioでこのDLLのバージョンを参照して、私は私のアプリでInnerTypeを使用していました: は、それがInnerTypeであると言います。ただし、InnerType内のコードが変更される可能性があるため、アセンブリは実行時に "AssemblyResolve"イベントでロードされます。

しかし、このクラスの名前空間が変更されている今、:

namespace SeparatedAssembly.Inner 
{ 
    public class InnerType 
    { 

    } 
} 

をだから私のアプリはもうこのタイプを見つけることができないので、私は例外TypeLoadExceptionを持っています。この新しいバージョンを参照するだけで、このDLLの古いバージョンと互換性があるため、私が使用する名前空間を変更することはできません。

私の質問は、AssemblyResolveイベントでアセンブリ内で探す名前空間を指定することも可能ですか? この例外をキャッチして別の名前空間で試してみる方法があれば、それもOKです。

ありがとうございました。

答えて

1

いいえ、呼び出すメソッドの完全な名前が呼び出し側アセンブリで指定されているため、簡単な方法で「書き換え」できません。名前空間は名前の一部です。私はしばらく前に与えた別の回答への参考にします:Is C# namespace compiled into IL files to be “complete” names?

TryRoslyn例を得た:

namespace Foo 
{ 
    public class Bar 
    { 
     public void Zoo() 
     { 
      Console.WriteLine("Hello"); 
     } 
    } 
} 

(名前空間Foo直接名Foo.Barの一部である)

.class public auto ansi beforefieldinit Foo.Bar 
    extends [mscorlib]System.Object 
{ 

に変換した後にメソッド呼び出していますConsole.WriteLineは:

call void [mscorlib]System.Console::WriteLine(string) 
+0

答えが否定であっても、役立ちます。ありがとう。 – Jonyjack

+0

@Jonyjack私はあなたの問題について少し考えましたが、私は簡単な解決法、あるいはそう簡単ではない解決法を見ることができません。シムクラス(古い.dll用と新しい.dll用)を作成し、これらのシムクラスを共通のインターフェイスから派生させます(コードでこの共通インターフェイスのみを使用します)。それは非常に困難になる可能性がdllのオブジェクトを行う。 – xanatos

関連する問題