我的项目是WPF应用程序,它在初始化时借助Prism.Unity模块化动态加载模块(我自己的* .dll库)。我正在从包含dll的文件夹中使用DirectoryModuleCatalog解决模块。我也有第三方库,只需要加载我的某些模块即可。因此,当我加载需要第三个部分库的模块时-这些库也正在加载。
我想要实现的目标:我想将那些第三方库嵌入到相关模块中,以便在我不需要真正的第三方库时不会暴露它们。
我一直在寻找关于stackoverflow和codeproject的答案。基本上有两种主要解决方案:
2-ILMerge(对我不起作用)
这是1个解决方案。
我按照Jeffrey Richter的建议,将AppDomain.CurrentDomain.AssemblyResolve处理程序添加到我的App.OnStartup()处理程序中。它可以为我的主要项目WPF正确启动。当它缺少dll时-处理程序起作用。但是,当我的模块缺少第三方dll时,我正在处理FileNotFoundException。而且这里的主要问题是我的模块(手写的dll库)和WPF应用程序(可执行)都不知道彼此,直到Prism在运行时与他们成为朋友。我不能将AssemblyResolve添加到模块库中,因为它根本无法启动。我想将Prism注入到我的可执行文件中之前检查它是否具有所有需要的依赖项。但是我可能错了。
我也尝试过这个: https://www.codeproject.com/Articles/528178/Load-DLL-From-Embedded-Resource 和其他一些基本相同的解决方案。
// Here's where I subscribe to the event
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
// Hits only within WPF code. But not from external libs...
}
}
}
// Here's how my module (dll with ref to the third party lib) is being defined
[Module(ModuleName = ModuleNames.SomeModuleName)]
public class SomeModule: IModule
{
public void Initialize()
{
// Doesn't invoke when has third party libraries as embedded
// resources
}
}