2013-03-15 72 views
0

我创建了一个自定义代码活动,还与自定义设计 - 这是我使用以下约定WF4运行时尝试加载松耦合活动设计

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

此工程在设计时应用到活动,我的设计师被加载(如果我将其放置在GAC中)并用于在设计图面上显示我的活动。

当我发布我的工作流时,设计器DLL不在生产服务器上(这正是我的意图 - 因此我通过DesignerAttribute构造函数的“强名称”版本引用设计器,而不是创建硬链接到设计器DLL)。然而,当运行时加载生产服务器上的工作流时 - 它会抛出TypeNotFound异常 - 尝试加载MyDesignerType/DLL。为什么?? 为什么工作流运行时尝试在运行时加载设计时功能? DesignerAttribute带有松散耦合构造函数的全部原因是为了避免在设计器DLL中部署产品...

任何帮助将不胜感激。

感谢

+0

这可能不是动作发生的地方。收听[TypeResolve事件](http://msdn.microsoft.com/en-us/library/system.appdomain.typeresolve.aspx),注意尝试在运行时加载该程序集,然后检查调用堆栈的时间它会引发火灾。在那里你会找到你的答案。 – Will 2013-03-15 10:35:35

回答

2

如果你想要松散耦合的活动设计,你会根本不适用的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

+0

谢谢Jota。为了他人的利益 - 我的设置是3个项目XXX.dll(活动项目),XXX.Design.dll(设计器)和YYY.dll(包含我的工作流程的项目)。为了让Visual Studio成功检测到我的设计器DLL并执行注册,XXX.Design.dll务必位于ACTIVITY项目的输出目录中...因此,您可能需要在活动项目上进行构建后步骤,设计器DLL导入到活动输出目录中。 – Adam 2013-03-18 20:11:58