当有多个时,C# 在运行时在资源设计器中加载正确的嵌入式程序集

C# Loading correct embedded assembly in resource designer at runtime when there are multiple

我有一些程序集 (DLL) 作为资源嵌入(在资源设计器中)。 在运行时我试图加载它们。为此,我订阅了如下活动:

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 并相应地加载它?

在上面的方法中,我知道 args.Name 包含要加载的 DLL 的名称,但它是一个字符串,后跟其他信息,如版本、区域性等...:[=​​14=]

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

我终于完成了下面的工作,它正在运行:

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

拜托,如果有人有更好的想法,请分享。