我将一些程序集(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;
}
答案 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;
}
请,如果有人有更好的想法,请分享。