2

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

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

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

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

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

任何帮助将不胜感激。

谢谢

4

1 回答 1

4

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

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

  • MyProject.Activity.dll
  • 我的项目。活动。设计.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()在您将设计器附加到活动的位置执行。

于 2013-03-15T10:54:26.190 回答