2017-07-27 8 views
-1

1つのEXEアプリケーションを作成しようとしています。そのために、私は私のアプリに埋め込みリソースとしてタグ付けされた2つのDLLを持っています。私は首尾よくAppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(myresolve)メソッドを使用して、イベントが発生したときにアセンブリを返すことができます。C#:AssemblyResolve関数を使用して複数のアセンブリを解決する

私の問題は、アプリケーション内のメソッドが複数のアセンブリを参照していることです。上記のイベントハンドラを使用してアセンブリをロードして返すと、アプリケーションは間違ったアセンブリファイル内のメソッドを探し、「型のロード例外」を取得します。

したがって、使用する可能性のあるメソッドのアプリケーションが適切な場所にあるようにアセンブリをロードするにはどうすればよいですか?

大切にしてください。

コードサンプル:

DLL解像度:L.B.の提案を1として

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveDll) 

     static Assembly ResolveDll(object sender, ResolveEventArgs args) 
     { 
      using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyApplication.Resources.MyDll1.dll")) 
      { 
       byte[] assemblyData = new byte[stream.Length]; 
       stream.Read(assemblyData, 0, assemblyData.Length); 
       return Assembly.Load(assemblyData); //Obviously resolves the first DLL, but how can I also resolve the second? 
      } 
     } 

void SomeMethod() 
{ 
    MyDll1.Class.CallAMethod() 
    MyDll2.Class.CallAnotherMethod() //Type Load exception - Assembly Resolution told it to look in MyDll1. 
} 
+1

最小限の再現性のあるコードサンプルを含めてください。 –

+0

あなたは 'args.Name'を使ってみましたか? –

+0

私はしていません。あなたが考えていたことの短い例を教えてください。 – ASB

答えて

0

args.nameを使用してブロックし、その後/場合は、私はシンプルを試してみました。これがトリックでした。

if (args.Name == "MyDll1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") 
     { 
      using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyApplication.Resources.MyDLL1.dll")) 
      { 
       byte[] assemblyData = new byte[stream.Length]; 
       stream.Read(assemblyData, 0, assemblyData.Length); 
       return Assembly.Load(assemblyData); 
      } 

     } 
     else if (args.Name == "MyDll2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") 
     { 
      using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyApplication.Resources.MyDll2.dll")) 
      { 
       byte[] assemblyData = new byte[stream.Length]; 
       stream.Read(assemblyData, 0, assemblyData.Length); 
       return Assembly.Load(assemblyData); 
      } 
     } 
関連する問題