GACの共通アセンブリを参照するカスタムアクティビティを実行するCRMワークフローでエラーが発生しましたが、バージョンは異なります。Dynamics CRMカスタムワークフローアクティビティとGAC参照バージョン
アセンブリAとアセンブリB(両方のカスタムアクティビティ)リファレンスアセンブリCは、AおよびBの基本クラス(Crimvcutil生成クラス)の基本クラス(CodeActivityを継承します)を含みます。アセンブリCは、複数のバージョンでGACに存在します。今度はCRMで新しい属性を作成し、初期の型をcrmsvcutilで再生成し、アセンブリCのバージョンを1.0.0.3に更新してGACに入れ、アセンブリB(新しい属性を使用)を再構築し、プラグイン登録ツールを使用して更新しました。
"assembly.type"を "assembly.type"に変換できないというエラーメッセージを表示して、アセンブリAとBの両方を参照するワークフローにエラーが表示されます。基底クラス(アセンブリ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を参照しているにもかかわらず、新しいバージョンのCを参照しています。アセンブリBからのアクティビティだけを持つワークフローを作成すると、アセンブリAが同じWFでBの前に参照されている場合にのみ有効です。
これは問題です今は運用環境で、私はそれを修正しようとしています。私はCの新しいバージョンを使用するアセンブリAを更新することができ、私はテスト環境でそれをやったことがわかっていますが、アセンブリがたくさんあるので2つ、多くのテストを実行する必要があります。
- 更新されたアセンブリBを古いバージョンのC(そして、新しい属性の属性名を持つインデクサを使用する)に何とか指してもいいですか?私はアセンブリのバージョンを1.0.0.2に戻してみましたが、もう一度Bをコンパイルしましたが、プラグイン登録ツールでアセンブリを更新できないというエラーが発生しました。
- 誰かが、参照されているアセンブリのバージョンをどのように保持しているのか、どのように説明しているのですか?これは.NETの一般的な仕組みですか?
私は基本クラスと初期型のクラスをアセンブリB(それ自身の名前空間)にコピーしようとしましたが、アセンブリCへの参照を完全に削除して、プラグインレジストリツールで更新しました。同じエラー、今回は "AssemblyC.type"を "AssemblyB.type"に変換できません。アセンブリCへの参照を完全に削除したときの仕組みを理解できません。
事前に感謝します。
編集:これはダイアログにのみ関連していることがわかりました。ワークフローでうまく動作します。それはどんな鐘を鳴らしますか?
@shytikovに感謝します。このタイプの登録にサポートされていないリソースが使用される可能性があるため、すべてのCWAを分離モードで登録できるかどうかを検討します。 私は自分の質問を編集したので、ダイアログにしか関係していないようです。共通のアセンブリ参照を削除し、基底クラスと各CWAに生成された型をコピーする場合、強力な型を扱えるように "ProxyTypesAssembly"プロパティを設定する必要がありますか? 今後のアップデートで使用できる解決策はありますか?バージョンに影響を与えずにGACアセンブリをアップデートできますか? – Zare