2017-04-12 33 views
0

我有一些作爲資源嵌入的程序集(DLL)(在資源設計器中)。 在運行時我試圖加載它們。要做到這一點我已經訂閱了一份事件象下面這樣:C#在運行時在資源設計器中加載正確的嵌入式程序集時有多個

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Resolver); 

,然後方法如下:

public System.Reflection.Assembly Resolver(object sender, ResolveEventArgs args) 
{ 
      try 
      { 
       Assembly a2 = Assembly.Load(Properties.Resources.OneDLL);    
       return a2; 
      } 
      catch (Exception ex) 
      { 
       // do something 
      } 

      return null; 
} 

上面的代碼效果很好,當我只有嵌入在一個資源DLL我因爲我知道通過Properties.Resources.OneDLL加載哪一個,如上例所示。

問題是,當我有一些嵌入式資源作爲資源時,我的意思是,在上面的方法中,一旦引發事件,我不知道爲了加載它是什麼DLL。

在這個方法中,我怎麼知道哪個DLL是相應的並加載它?

在上面的方法,我知道args.Name包含加載DLL的名稱,但它是一個字符串,然後像版本,文化等其他信息......:

"mynamespace.OneDLL, Version=2.3.0.0, Culture=neutral, PublicKeyToken=null" 

的方法是什麼像這樣:

public System.Reflection.Assembly Resolver(object sender, ResolveEventArgs args) 
{ 
      try 
      { 
       Assembly a2; 
       if (args.Name == 'OneDLL') 
       { 
        a2 = Assembly.Load(Properties.Resources.OneDLL); 
       } 
       else if (args.Name == 'AnotherDLL') 
       { 
        a2 = Assembly.Load(Properties.Resources.AnotherDLL); 
       } 
       else if (args.Name == 'AnotherAnotherDLL') 
       { 
        a2 = Assembly.Load(Properties.Resources.AnotherAnotherDLL); 
       } 
       else 
       { 
        return null; 
       } 

       return a2; 
      } 
      catch (Exception ex) 
      { 
       // do something 
      } 

      return null; 
} 
+0

所以問題是你不想分析該程序集名字字符串? – Evk

+0

@Evk沒有。首先,我不知道解析程序集名稱是否是正確的方法。其次,如果它是正確的方法,從args我可以獲取DLL的名稱,例如,做String.Split(「,」)[0] .toString(),然後比較它看看是什麼要加載的DLL。這裏的問題是:從Properties.Resources.OneDLL如何獲得名稱來比較與String.Split(「,」)[0] .toString()? – user1624552

+1

那麼你應該事先知道什麼程序集在你的資源中存儲爲「OneDLL」,所以它應該不是問題。 – Evk

回答

0

最後我在下面做,這是工作:

public System.Reflection.Assembly Resolver(object sender, ResolveEventArgs args) 
{ 
      Assembly assembly; 
      string strAssembly; 

      strAssembly = args.Name.Split(',')[0].ToString(); 
      assembly = null; 

      try 
      { 
       Assembly assembly ; 
       if (strAssembly == 'OneDLL') 
       { 
        assembly = Assembly.Load(Properties.Resources.OneDLL); 
       } 
       else if (strAssembly == 'AnotherDLL') 
       { 
        assembly = Assembly.Load(Properties.Resources.AnotherDLL); 
       } 
       else if (strAssembly == 'AnotherAnotherDLL') 
       { 
        assembly = Assembly.Load(Properties.Resources.AnotherAnotherDLL); 
       } 
       else 
       { 
        // do something 
        return assembly; 
       } 

       return assembly; 
      } 
      catch (Exception ex) 
      { 
       // do something 
      } 

      return assembly; 
} 

請,如果有人有更好的主意去做,請分享。

+1

這是完美的方式來做到這一點。如果你想 - 你可以這樣做'新的AssemblyName(args.Name).Name'而不是字符串分割,以獲得程序集名稱。 – Evk

+0

太棒了!謝謝。 – user1624552