我在運行自定義活動的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,並且我在測試環境中執行了它,但由於有更多的程序集,因此必須執行兩個或更多測試。
- 我可以以某種方式將更新後的程序集B指向C的舊版本(並使用具有新屬性的屬性名稱的索引器)嗎?我嘗試將C程序集的版本恢復到1.0.0.2,再次編譯B,但後來發現程序集無法在插件註冊工具中更新。
- 有人可以解釋一個程序集如何以及在何處保存引用程序集的版本。這一般在.NET中如何工作?
最奇怪的是,我試圖基類和早期類型的類複製到組件B(在它自己的命名空間),完全刪除提及裝配C,更新的插件,註冊表工具,我得到確切同樣的錯誤,這次「AssemblyC.type」不能被轉換爲「AssemblyB.type」。我不知道如何當我完全刪除參考組件C.
任何建議表示讚賞,在此先感謝。
編輯:我剛剛發現,這隻涉及對話框。它適用於工作流程。那響鈴嗎?
感謝回覆@shytikov,我會考慮是否所有的CWA都可以在隔離模式下注冊,因爲其中一些可能會使用不受支持的資源進行此類註冊。 當我編輯我的問題時,它似乎只涉及對話框,wfs很好(響鈴)?如果我刪除常見程序集引用並將基類和生成類型複製到每個CWA,是否必須將「ProxyTypesAssembly」屬性設置爲能夠使用強類型? 有沒有可以在未來更新中使用的解決方案,我可以更新GAC程序集而不影響其版本嗎? – Zare