2017-07-27 257 views
-1

我试图制作一个EXE应用程序。为此,我有两个在我的应用程序中被标记为嵌入资源的DLL。当事件触发时,我可以成功使用AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(myresolve)方法返回装配体。C#:使用AssemblyResolve函数解析多个程序集

我遇到的困难是我的应用程序中的方法引用了多个程序集。当我使用上面的事件处理程序加载并返回我的程序集时,我的应用程序在错误的程序集文件中查找一个方法,并得到一个“类型加载异常”。

因此,如何加载我的程序集,以便我的应用程序在适当的位置查找可能使用的任何方法?

亲切的问候。

代码示例:

DLL分辨率:

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

作为每L.B.的建议,我试图简单如果/则块使用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); 
      } 
     }