我目前正在编写一个带有插件系统的应用程序套件,该系统使用 MEF 框架在运行时加载插件。
我目前已经设置了我的顶级 WPF 应用程序之一,以将其引用的 DLL 嵌入为嵌入式资源,并使用此处描述的方法在运行时加载它们。
这工作正常,我得到运行良好的单文件 WPF 应用程序。
但是,我的另一个顶级控制台应用程序使用 MEF 框架在运行时加载插件(WPF 应用程序是固定的并明确包含插件)。我的插件本身对各种库有几个依赖项,控制台应用程序从中加载插件的扩展文件夹中到处都是各种库 dll。
我想将每个插件的依赖项嵌入其中,以便我的扩展目录仅包含顶级 DLL 文件。我上面使用的方法不适合这种方法,因为插件组件找不到所需的依赖项,因为它只是正在搜索这些嵌入式资源的执行程序集。
我当前的 OnResolveAssembly 方法如下所示:
public static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
{
Assembly executingAssembly = Assembly.GetExecutingAssembly();
var assemblyName = new AssemblyName(args.Name);
string path = assemblyName.Name + ".dll";
if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false)
{
path = String.Format(@"{0}\{1}", assemblyName.CultureInfo, path);
}
using (Stream stream = executingAssembly.GetManifestResourceStream(path))
{
if (stream == null)
return null;
var assemblyRawBytes = new byte[stream.Length];
stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
return Assembly.Load(assemblyRawBytes);
}
}
我认为最好的方法是添加功能以跟踪列表中加载的所有程序集,一旦以这种方式加载了新程序集,递归地执行相同的操作;随时加载其中的任何嵌入式 DLL。然后,您可以将这些 DLL 添加到将充当缓存的列表中。
是否有更好的方法来进行此操作?