WPF中的链式引用程序集

3
今天我想知道如何在C# WPF中配置引用其他程序集的项目,其中这些程序集又以链式结构相互关联。所谓“链式结构”是指以下情形:
- 我们有一个应用程序,它引用了名为Plugin的程序集。 - Plugin程序集引用了Resources,Resources中包含Plugin所需的资源,例如图像。 - 主应用程序并没有以任何方式引用Resources。
下图展示了刚才所说的内容: Chain-referenced assemblies 问题在于,Resources并未复制到应用程序的bin文件夹中,导致插件(图中的Ctrl)无法找到它所需的资源。 解决方法 有一些解决方法可以解决这个问题,即将Resources包含在主应用程序的引用中,或者使用后期构建步骤,在该步骤中手动复制所需的文件。 结论 总之,我想问一下,你们是如何处理这个问题的?除了我在解决方法部分提到的方法之外,还有其他解决方案吗?我在项目配置中漏掉了什么吗?
2个回答

1

请确保插件项目属性中的输出目录与您的应用程序的输出目录相同。否则,您需要像平常一样手动复制文件。

第二个选项是使用嵌入式资源。


不幸的是,这两个选项都是不可接受的。'Res' 项目通常是我的 'CommonControls' 库,它非常庞大 - 将其嵌入到 'Ctrl' 项目中并不是一个好主意。复制文件只会让人感到烦恼和低效 :( 尽管如此,还是感谢您提供的嵌入想法。 - SOReader

0
如果您从与EXE不同的文件夹动态加载插件,则还可以将其依赖项复制到与插件相同的文件夹中,并动态加载这些程序集。然后,您需要处理AssemblyResolve,以便已加载的程序集将被解析,而不是尝试查找新程序集:
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
    private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        var domain = (AppDomain)sender;
        var assemblies = domain.GetAssemblies();
        return assemblies.FirstOrDefault(assembly => assembly.GetName().Name == args.Name.Split(',')[0]);
    }

上面的代码执行版本和强名称不敏感匹配;如果您想要更严格的内容,可以在此处实现自己的策略。

谢谢您的回答,但问题不是关于从代码动态加载依赖项,而是关于在MSVS项目上下文菜单中的“添加引用...”选项。 - SOReader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接