2016-08-24 97 views
0

我在運行自定義活動的CRM工作流程中遇到了錯誤,該活動引用了GAC的常見程序集,但版本不同。情況如下:Dynamics CRM自定義工作流程活動和GAC參考版本

程序集A和程序集B(包括定製活動)引用程序集C包含A和B的基類以及crmsvcutil生成的類的基類(繼承自CodeActivity)。組件C在GAC中存在多個版本。現在,我在CRM中創建了一個新屬性,使用crmsvcutil重新生成早期類型,將程序集C的版本更新到1.0.0.3並將其放入GAC,重新構建程序集B(使用新屬性)並使用插件註冊工具對其進行更新。

錯誤顯示在工作流程中,它引用程序集A和B並顯示「assembly.type」不能轉換爲「assembly.type」的錯誤消息。在基類(組裝C)我們設置的組件屬性能夠與強類型的工作:

IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>(); 
var type = Type.GetType("Microsoft.Crm.Workflow.SynchronousRuntime.WorkflowContext, Microsoft.Crm.Workflow, Version=5.0.0.0"); 
type.GetProperty("ProxyTypesAssembly").SetValue(serviceFactory, typeof(XrmServiceContext).Assembly, null); 
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); 

這在我看來,CRM與代理類型一起緩存的基類,並試圖在裝配使用過b ,儘管它引用了新版本的C.如果我使用程序集B中的活動創建工作流程,它工作正常,但只有在程序集A在同一個WF中和之前引用B時纔可以。

這是一個問題現在在生產環境中,我正在嘗試爲它找到解決方法。我知道我可以更新程序集A以使用新版本的C,並且我在測試環境中執行了它,但由於有更多的程序集,因此必須執行兩個或更多測試。

  1. 我可以以某種方式將更新後的程序集B指向C的舊版本(並使用具有新屬性的屬性名稱的索引器)嗎?我嘗試將C程序集的版本恢復到1.0.0.2,再次編譯B,但後來發現程序集無法在插件註冊工具中更新。
  2. 有人可以解釋一個程序集如何以及在何處保存引用程序集的版本。這一般在.NET中如何工作?

最奇怪的是,我試圖基類和早期類型的類複製到組件B(在它自己的命名空間),完全刪除提及裝配C,更新的插件,註冊表工具,我得到確切同樣的錯誤,這次「AssemblyC.type」不能被轉換爲「AssemblyB.type」。我不知道如何當我完全刪除參考組件C.

任何建議表示讚賞,在此先感謝。

編輯:我剛剛發現,這隻涉及對話框。它適用於工作流程。那響鈴嗎?

回答

0

幾個想法。

對我來說,它看起來像早期裝配有時會產生更多的問題,而不是幫助解決。這裏的主要問題是缺乏透明度。一切都隱含在幕後。用戶對此沒有任何控制權。

我注意到CRM自動解決了一個AppDomain內的早期裝配程序集。這基本上意味着,如果您有兩個使用不同版本的早期裝配的裝配,則首先裝入的裝配將拖動其早期裝配到AppDomain,而所有其他插件CWA將被迫使用先前裝配加載早期裝配。

如何解決?如果這些自定義工作流程活動用於不同的工作流程 - 嘗試單獨註冊程序集。我還沒有嘗試過這種情況,但是如果這些工作流程不會共享AppDomain早期綁定類型不會混淆。

另一種方法:嘗試將所有早期裝配與您的CWA捆綁在一起。可能會導致異常巨大的文件,但很可能會解決您的問題(也可以從早期裝配中刪除未使用的定義,使其更加苗條)。

還有一個想法:請檢查link。在XrmToolBox,我們正在努力尋找解決方案。基本上,有一種方法可以手動將延遲裝配投影到選定的早期邊界。

XrmToolBox也包含此proposal,它允許直接指定要使用的程序集。

+0

感謝回覆@shytikov,我會考慮是否所有的CWA都可以在隔離模式下注冊,因爲其中一些可能會使用不受支持的資源進行此類註冊。 當我編輯我的問題時,它似乎只涉及對話框,wfs很好(響鈴)?如果我刪除常見程序集引用並將基類和生成類型複製到每個CWA,是否必須將「ProxyTypesAssembly」屬性設置爲能夠使用強類型? 有沒有可以在未來更新中使用的解決方案,我可以更新GAC程序集而不影響其版本嗎? – Zare

相關問題