【问题标题】:WF4 Runtime attempts to load loosely coupled Activity DesignerWF4 运行时尝试加载松散耦合的活动设计器
【发布时间】:2013-03-15 01:13:40
【问题描述】:

我创建了一个自定义代码活动,还有一个自定义设计器 - 我已使用以下约定将其应用于活动

[Designer("MyDesignerType, Assembly, Version=1.0.0.0, PublicKeyToken=XXX")]

这在设计时工作,我的设计器已加载(如果我将它放在 GAC 中)并用于在设计图面上显示我的活动。

当我发布我的工作流程时,设计器 DLL 不在生产服务器上(这正是我的意图 - 因此我通过 DesignerAttribute 构造函数的“强名称”版本引用设计器,而不是创建一个硬- 链接到设计器 DLL)。

但是,当运行时在生产服务器上加载工作流时 - 它会抛出 TypeNotFound 异常 - 试图加载 MyDesignerType/DLL。为什么?? 为什么工作流运行时试图在运行时加载设计时功能? DesignerAttribute 带有松散耦合构造函数的全部原因是避免将设计器 DLL 与产品一起部署......

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 这可能不是动作发生的地方。收听TypeResolve event,观察在运行时加载该程序集的尝试,然后在它触发时检查调用堆栈。在那里你会找到你的答案。

标签: xaml workflow-foundation-4 workflow-foundation


【解决方案1】:

如果您想要松耦合的活动设计器,则根本不会应用 DesignerAttribute

所以基本上,为了支持您的方案,您将拥有 2 个这样的 dll:

  • MyProject.Activities.dll
  • MyProject.Activities.Design.dll

这里的关键部分是 Design.dll。在该 dll 中,您应该有一个实现 IRegisterMetadata 的类,这就是神奇发生的地方。

IRegisterMetadata 类型提供了一种封装关联的方法 以松散耦合的方式将设计时属性分配给运行时类型 时尚。托管 Windows 工作流设计器的应用程序可以使用 IRegisterMetadata 接口注册属性 活动。例如,Visual Studio 2010 搜索的类型 当程序集包含这些类型时实现 IRegisterMetadata 除了在 *.design 中查找类型之外,还加载了 程序集。

如何通过 IRegisterMetadata 为活动注册设计师:

class Metadata : IRegisterMetadata
{
    public void Register()
    {
        AttributeTableBuilder builder = new AttributeTableBuilder();
        // Register Designers.
        builder.AddCustomAttributes(typeof(MyActivity), new DesignerAttribute(typeof(MyActivityDesigner)));
        // Apply the metadata
        MetadataStore.AddAttributeTable(builder.CreateTable());
    }
}

Visual Studio 工作流设计器将查找以 .Design.dll 结尾的 dll,如果找到它,它将执行 IRegisterMetadata.Register(),您将在其中将设计器附加到活动。

【讨论】:

  • 谢谢乔塔。为了他人的利益 - 我的设置是 3 个项目 XXX.dll(活动项目)、XXX.Design.dll(设计师)和 YYY.dll(包含我的工作流程的项目)。为使 Visual Studio 成功检测到我的设计器 DLL 并执行注册,XXX.Design.dll 必须位于 ACTIVITY 项目的输出目录中……因此您可能需要在活动项目上执行构建后步骤,以复制设计器 DLL 到活动输出目录中。
猜你喜欢
  • 1970-01-01
  • 2010-11-28
  • 2017-06-05
  • 2020-10-26
  • 2011-02-22
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多