2017-04-12 5 views
0

J'ai des assemblys (DLL) incorporés en tant que ressource (dans le concepteur de ressources). Au moment de l'exécution, j'essaie de les charger. Pour ce faire, je suis abonné à un événement comme ci-dessous:C# Chargement de l'assemblage incorporé correct dans le concepteur de ressources lors de l'exécution lorsqu'il y en a plusieurs

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

et la méthode est la suivante:

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; 
} 

code ci-dessus fonctionne bien quand je n'ai qu'une DLL intégré comme une ressource dans mon application parce que je sais lequel charger par Properties.Resources.OneDLL comme dans l'exemple ci-dessus. Le problème est lorsque certaines DLL sont incorporées en tant que ressource, je veux dire, dans la méthode ci-dessus, une fois que l'événement est levé, je ne sais pas ce que DLL est pour le charger.

Dans cette méthode, comment puis-je savoir quelle DLL est et charger en conséquence?

Dans la méthode ci-dessus, je sais args.Name contient le nom de la DLL à charger mais est une chaîne suivie d'autres informations comme la version, la culture, etc ...:

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

méthode serait quelque chose comme ceci:

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

Donc le problème est que vous ne voulez pas analyser cette chaîne de nom d'assembly? – Evk

+0

@Evk Eh bien pas du tout. Premièrement, je ne sais pas si c'est la bonne façon d'analyser le nom de l'assemblage. Deuxièmement, si c'est la bonne façon de le faire, à partir des args je peux obtenir le nom de la DLL, par exemple, en faisant String.Split (",") [0] .toString() et ensuite le comparer pour voir ce qui est la DLL à charger. Le problème ici est: de Properties.Resources.OneDLL comment puis-je obtenir le nom à comparer avec String.Split (",") [0] .toString()? – user1624552

+1

Eh bien, vous devriez savoir à l'avance quel assemblage est stocké comme "OneDLL" dans vos ressources, donc cela ne devrait pas poser de problème. – Evk

Répondre

0

Enfin je l'ai fait ci-dessous et il fonctionne:

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; 
} 

S'il vous plaît, Si Quelqu'un a une meilleure idée de le faire, s'il vous plaît partager.

+1

C'est une excellente façon de le faire. Si vous voulez - vous pouvez faire ceci 'new AssemblyName (args.Name) .Name' au lieu de la division de chaîne, pour obtenir le nom d'assembly. – Evk

+0

Super !! Merci. – user1624552