C#在多个

时间:2017-04-12 13:00:39

标签: c# visual-studio-2008 .net-3.5 .net-assembly

我将一些程序集(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的名称,但是后跟其他信息(如版本,文化等)的字符串......:

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

1 个答案:

答案 0 :(得分: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;
}

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