2017-04-12 10 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をロードするためのDLLがわかりません。

どのようにすれば、どのDLLがどのDLLであるかを知ることができます。

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

方法は何かのようになります。私は上記の方法で

はargs.Nameが...ロードするDLLの名前が含まれていますが、バージョンなど、文化、のような他の情報が続く文字列です知っています

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( "、")[。] totoString()を実行して比較すると、ロードされる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

それはそれを行うための完璧な方法です。必要ならば、アセンブリ名を得るために、文字列分割の代わりに 'new AssemblyName(args.Name).Name'を実行することができます。 – Evk

+0

素晴らしい!ありがとう。 – user1624552

関連する問題