【问题标题】:How to add types from external assembly to toolbox control? (WPF)如何将类型从外部程序集添加到工具箱控件? (WPF)
【发布时间】:2011-06-03 10:59:05
【问题描述】:

我试图在我的 WPF 应用程序中做这样的事情:

    ToolboxControl ctrl = new ToolboxControl();
    Assembly assembly = Assembly.LoadFile(file);
    var category = new ToolboxCategory(assembly.GetName().Name);
    foreach (Type t in assembly.GetTypes())
    {
        var wrapper = new ToolboxItemWrapper(t, t.Name);
        category.Add(wrapper);
    }
    ctrl.Categories.Add(category);

即为在程序集中找到的每种类型添加 ToolboxItemWrappers。然而最后一行抛出以下异常(见图)

http://img41.imageshack.us/img41/2261/7xvqv.png http://img41.imageshack.us/img41/2261/7xvqv.png

外部程序集的所有依赖项也在主 (WPF) 应用程序中引用。那么这里出了什么问题以及如何解决呢?

【问题讨论】:

    标签: c# .net wpf assemblies toolbox


    【解决方案1】:

    文件中有 CustomLibrary 程序集吗?如果没有,请在您的应用程序中挂钩此事件 AppDomain.CurrentDomain.AssemblyResolve,并加载 filePath 处的程序集引用的任何其他程序集。如果 CustomLibrary 或其他 dll 不在 GAC 中,则它是必需的。

    【讨论】:

    • 我建议你挂钩到 AssemblyResolve 事件并放置一个断点。您将知道所有类型都被引用以及 CLR 无法找到哪些依赖项。
    • 你是对的。另见this answer
    【解决方案2】:

    确保在 GAC 中安装了“CustomLisbrary”。此外,您可能需要创建 design.dll 和 VisualStudio.design.dll。

    【讨论】:

      【解决方案3】:

      您正在使用Assembly.LoadFile 通过反射加载程序集。但是,此方法不会自动在同一目录中查找依赖项。你应该使用Assembly.LoadFrom

      还要考虑到 LoadFrom 通过 Fusion 允许将加载请求重定向到另一个程序集,而 LoadFile 完全加载您请求的内容。

      【讨论】:

      • 感谢您的回答!什么是融合?
      • 我试过把LoadFile改成LoadFrom还是不行。
      • Fusion 是 CLR 的程序集加载器组件。假设您在请求 CustomLibrary 时遇到的异常通过 Fusion,您可以使用 Fusion log viewer 来验证程序集加载失败的原因。
      猜你喜欢
      • 2011-02-17
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      相关资源
      最近更新 更多