C#当存在多个资源时,在运行时在资源设计器中加载正确的嵌入式程序集
我有一些程序集(DLL)作为资源嵌入(在资源设计器中)。 在运行时,我试图加载它们。为此,我已订阅了以下活动: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
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
而不是字符串拆分,以获取程序集名称。