当有多个时,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;
}
拜托,如果有人有更好的想法,请分享。
我有一些程序集 (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;
}
拜托,如果有人有更好的想法,请分享。