WF4运行时尝试加载松散耦合的Activity Designer

时间:2013-03-15 01:13:40

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

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

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

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

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

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

非常感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:2)

如果您想要松散耦合的Activity Designer,则根本不会应用DesignerAttribute

所以基本上,为了支持你的场景,你将有2个这样的dll:

  • MyProject.Activities.dll
  • MyProject.Activities。的 Design.dll

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

  

IRegisterMetadata类型提供了一种封装关联的方法   设计时属性到松散耦合的运行时类型   时尚。托管Windows Workflow Designer的应用程序可以使用   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(),您将设计人员附加到活动中。

了解详情:Why you should use IRegisterMetadata