我创建了一个自定义代码活动,也使用自定义设计器 - 我已使用以下约定将其应用于活动
[Designer("MyDesignerType, Assembly, Version=1.0.0.0, PublicKeyToken=XXX")]
这适用于设计时,我的设计师已加载(如果我将其放在GAC中)并用于在设计图面上显示我的活动。
当我发布我的工作流程时,设计器DLL不在生产服务器上(这正是我的意图 - 因此我通过DesignerAttribute构造函数的'strong-name'版本引用了设计器,而不是创建一个 - 链接到设计器DLL)。
但是,当运行时在生产服务器上加载工作流时 - 它会抛出一个TypeNotFound异常 - 尝试加载MyDesignerType / DLL。为什么?? 为什么工作流运行时试图在运行时加载设计时功能? DesignerAttribute带有松散耦合构造函数的全部原因是为了避免使用产品部署设计器DLL ...
非常感谢任何帮助。
由于
答案 0 :(得分:2)
如果您想要松散耦合的Activity Designer,则根本不会应用DesignerAttribute
。
所以基本上,为了支持你的场景,你将有2个这样的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()
,您将设计人员附加到活动中。