2011-07-25 12 views
0

次のような状況があります。 n個のフォルダには、それぞれ含む2つのアセンブリは、ありますC#Reflection、AppDomain:異なるフォルダから同じアセンブリを実行

Assembly1.dllAssembly2.dll

  • すべてAssembly1.dllのあるまったく同じ

  • すべてAssembly2.dllさんわずかに異なりますが、同じクラス/メソッドを持っています。

  • 私のプログラムでは

をAssembly2.dllするすべてのAssembly1.dllの参照、私はAssembly1内部のいくつかのクラスのインスタンスを作成し、そのクラスのメソッドを呼び出すしたいと思います:

for(int i = 0; i < 100; i++) 
{ 
    Assembly myAssembly1 = Assembly.LoadFrom("Directory"+ i + "\\Assembly1.dll"); 
    Type myType = myAssembly1.GetType("MyClass"); 

    object myObject = Activator.CreateInstance(myType); 
    myType.Invoke(myMethodName, BindingFlags.InvokeMethod, null, myObject, null); 
} 

このコードは、Assembly1.dllを含むフォルダごとに実行されます 問題は、最初のものはうまくいきますが、後でAssembly2.dllが既に読み込まれているため、再読み込みされません。ただし、現在のフォルダー(番号i)の内側に置き換える必要があります。これは若干異なるためです。

上記のコードを呼び出すたびに、同じアセンブリ2が使用されます。

私はすでに同様の質問を探しており、カスタムの使用に関するいくつかの提案を見つけました。AppDomains私はこれを試しましたが、正しく動作させることができませんでした。

誰かが、新しいAppDomainを初期化し、上記のコードをこの新しいドメイン内で実行して(参照されたAssembly2.dllが正しくロードされ、アンロードされるようにする)コード例を挙げることができますか?

または、誰かがその問題の解決方法について異なる考えを持っていますか?

幸運を祈り、 クリスチャン

+0

解決策を別の答えに移動して、正しいものとしてマークしてください。 –

答えて

0

私はついにそれを手に入れました。同じ問題を抱えている皆様には、これが解決策です。

AppDomain myDomain = AppDomain.CreateDomain("MyDomain"); 

string pathToTheDll = "C:\\SomePath\\MyAssembly1.dll"; 
object obj = myDomain.CreateInstanceFromAndUnwrap(pathToTheDll, "MyAssembly1.TypeName"); 
Type myType = obj.GetType(); 

myType.InvokeMember("SomeMethodName", BindingFlags.InvokeMethod, null, obj, null); 

AppDomain.Unload(myDomain); 

私はこれが誰かを助けてくれることを願っています!

1

チェックこのhttp://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspxアウトこのhttp://msdn.microsoft.com/en-us/library/ff527268.aspx ...あなたはAppDomains、負荷assembly1を作成し、それを正しいAssembly2を養うことができAssamblyResolve Eventのハンドラを割り当てることができます... はCan I specify dependency directories when dynamically loading assemblies?を見ます

+0

リンクをありがとうございます、私はこれを直接読んで試してみます。 – Christian

+0

私はまだ同じ点で立ち往生しています。私は最初の反復でこれらのアセンブリを読み込むことができますが、後でそれらを取り除くことはできません。ロードするAssembly2.dllの正しいバージョンが必要です。私は正常にアセンブリを新しいAppDomainにロードし、AppDomainも正常にアンロードしました(アセンブリは「モジュール」の下に消えます)。しかし、この新しいAppDomain内でクラスのインスタンスを作成するにはどうすればいいですか? – Christian

関連する問題