【问题标题】:Chain-referenced assemblies in WPFWPF 中的链引用程序集
【发布时间】:2012-06-03 14:27:32
【问题描述】:

今天我想知道您如何在 C# WPF 中配置您的项目,这些项目引用了链中的其他程序集。我所说的“链中”是指这样的:

  • 我们有引用程序集插件的应用程序
  • 插件程序集是指插件使用的资源所在的资源,例如。图片
  • 主应用程序不以任何方式引用资源。

下图说明了我刚才所说的:

问题是Resources没有复制到应用的bin文件夹,导致Plugin(图片上Ctrl)需要查找的资源失败。

解决方法

有一些解决方法,即简单地将资源包含到主应用程序的引用中,或者使用构建后步骤并在该步骤中手动复制所需的文件。

结论

最后,我想问一下您是如何处理这个问题的。除了我在 workaround 部分中提到的解决方案之外,还有其他解决方案吗?我是否遗漏了项目配置中的某些内容?

【问题讨论】:

    标签: c# wpf c#-4.0 assemblies external-assemblies


    【解决方案1】:

    确保插件项目属性中的输出目录与应用程序的输出目录相同。否则你必须自己复制文件。

    第二种选择是使用嵌入式资源。

    【讨论】:

    • 不幸的是,这两个选项都是不可接受的。 “Res”项目通常是我的“CommonControls”库,它非常大——将它嵌入到“Ctrl”项目中并不是一个好主意。处理文件只是烦人且适得其反:(不过,感谢嵌入的想法。
    【解决方案2】:

    如果您从与 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 中项目上下文菜单中的“添加引用...”选项
    猜你喜欢
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多