2013-03-15 69 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