Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#当存在多个资源时,在运行时在资源设计器中加载正确的嵌入式程序集_C#_Visual Studio 2008_.net 3.5_.net Assembly - Fatal编程技术网

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

C#当存在多个资源时,在运行时在资源设计器中加载正确的嵌入式程序集,c#,visual-studio-2008,.net-3.5,.net-assembly,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

我有一些程序集(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是什么

在这个方法中,我如何知道哪个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;
}

最后,我完成了以下工作,它正在发挥作用:

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

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

那么问题是你不想解析程序集名称字符串?@Evk一点也不想。首先,我不知道解析程序集名称是否正确。其次,如果这是正确的方法,我可以从args获取DLL的名称,例如,doing String.Split(“,”[0].toString(),然后比较它以查看要加载的DLL是什么。这里的问题是:从Properties.Resources.OneDLL如何获得与String.Split(“,”[0]).toString()比较的名称?您应该事先知道资源中存储为“OneDLL”的程序集,所以这应该不是问题。这是一个很好的方法。如果需要-可以执行此操作
新建程序集名称(args.Name).Name
而不是字符串拆分,以获取程序集名称。