Xaml WF4运行时尝试加载松散耦合的活动设计器

Xaml WF4运行时尝试加载松散耦合的活动设计器,xaml,workflow-foundation-4,workflow-foundation,Xaml,Workflow Foundation 4,Workflow Foundation,我已经创建了一个自定义代码活动,也使用了一个自定义设计器—我已经使用以下约定将其应用于该活动 [Designer("MyDesignerType, Assembly, Version=1.0.0.0, PublicKeyToken=XXX")] 这在设计时起作用,如果我将设计器放置在GAC中,它将被加载,并用于在设计图面上显示我的活动 当我发布我的工作流时,设计器DLL不在生产服务器上,这正是我想要的-因此,我通过DesignerAttribute构造函数的“强名称”版本引用设计器,而不是创建

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

[Designer("MyDesignerType, Assembly, Version=1.0.0.0, PublicKeyToken=XXX")]
这在设计时起作用,如果我将设计器放置在GAC中,它将被加载,并用于在设计图面上显示我的活动

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

但是,当运行时在生产服务器上加载工作流时,它会引发TypeNotFound异常,并尝试加载MyDesignerType/DLL。为什么? 究竟为什么工作流运行时试图在运行时加载设计时功能??DesignerAttribute附带松耦合构造函数的全部原因是为了避免在产品中部署designer DLL

任何帮助都将不胜感激


谢谢

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

因此,基本上,为了支持您的场景,您将有两个DLL,如下所示:

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

IRegisterMetadata类型提供了一种封装关联的方法 将设计时属性转换为松散耦合的运行时类型 时尚承载Windows工作流设计器的应用程序可以使用 IRegisterMetadata接口,用于注册 活动例如,VisualStudio2010搜索 在包含这些类型的程序集时实现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 workflow designer将查找以.Design.dll结尾的dll,找到该dll后,将执行IRegisterMetadata。注册将设计器附加到活动的位置。

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

因此,基本上,为了支持您的场景,您将有两个DLL,如下所示:

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

IRegisterMetadata类型提供了一种封装关联的方法 将设计时属性转换为松散耦合的运行时类型 时尚承载Windows工作流设计器的应用程序可以使用 IRegisterMetadata接口,用于注册 活动例如,VisualStudio2010搜索 在包含这些类型的程序集时实现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 workflow designer将查找以.Design.dll结尾的dll,找到该dll后,将执行IRegisterMetadata。请注册将设计器附加到活动的位置。

这可能不是操作发生的位置。侦听,观察在运行时加载该程序集的尝试,然后在调用堆栈时检查调用堆栈。在那里你会找到你的答案。这可能不是行动发生的地方。侦听,观察在运行时加载该程序集的尝试,然后在调用堆栈时检查调用堆栈。在那里你会找到你的答案。谢谢佐塔。为了其他人的利益-我的设置是3个项目XXX.dll活动项目、XXX.Design.dll设计器和包含我的工作流的YYY.dll项目。要使Visual Studio成功检测我的设计器DLL并执行注册,XXX.Design.DLL必须位于活动项目的输出目录中。。。因此,您可能需要在活动项目上执行生成后步骤,将设计器DLL复制到活动输出目录中。谢谢Jota。为了其他人的利益-我的设置是3个项目XXX.dll活动项目、XXX.Design.dll设计器和包含我的工作流的YYY.dll项目。要使Visual Studio成功检测我的设计器DLL并执行注册,XXX.Design.DLL必须位于活动项目的输出目录中。。。因此,您可能需要在活动项目上执行生成后步骤,将设计器DLL复制到活动输出目录中。