2016-08-24 6 views
0

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つ、多くのテストを実行する必要があります。

  1. 更新されたアセンブリBを古いバージョンのC(そして、新しい属性の属性名を持つインデクサを使用する)に何とか指してもいいですか?私はアセンブリのバージョンを1.0.0.2に戻してみましたが、もう一度Bをコンパイルしましたが、プラグイン登録ツールでアセンブリを更新できないというエラーが発生しました。
  2. 誰かが、参照されているアセンブリのバージョンをどのように保持しているのか、どのように説明しているのですか?これは.NETの一般的な仕組みですか?

私は基本クラスと初期型のクラスをアセンブリB(それ自身の名前空間)にコピーしようとしましたが、アセンブリCへの参照を完全に削除して、プラグインレジストリツールで更新しました。同じエラー、今回は "AssemblyC.type"を "AssemblyB.type"に変換できません。アセンブリCへの参照を完全に削除したときの仕組みを理解できません。

事前に感謝します。

編集:これはダイアログにのみ関連していることがわかりました。ワークフローでうまく動作します。それはどんな鐘を鳴らしますか?

答えて

0

いくつかのアイデア。

初期のアセンブリでは、解決に役立つよりも多くの問題が生じることがあります。ここでの主な問題は、透明性の欠如です。すべて暗黙のうちにシーンの後ろで行われます。ユーザーはこれを何も制御できません。

私は、CRMが自動的に早期バインディングアセンブリを1つのAppDomainに解決することに気付きました。つまり、最初にロードされたアセンブリがAppDomainに追加され、それ以降のすべてのプラグインにCWAが以前に使用されていた初期バインドアセンブリをドラッグすると、以前のアセンブリのバージョンが異なる2つのアセンブリがある場合は、初期バインディングされたアセンブリをロードします。

修正方法?これらのカスタムワークフローアクティビティが異なるワークフローで使用されている場合は、アセンブリを単独で登録しようとします。私はそのシナリオを試していませんが、これらのワークフローが同じではない場合は、AppDomain早期バインドされた型は混乱しません。

もう1つの方法:すべての初期バインディングアセンブリをCWAにバンドルしてみてください。異常に巨大なファイルになる可能性がありますが、問題を解決する可能性が最も高くなります(初期のアセンブリから未使用の定義を削除して、よりスリムにすることもできます)。

もう1つ考えてください:linkをチェックしてください。ここではXrmToolBoxに、その問題の解決策を見つけることを試みています。基本的に、遅延バインディングされたアセンブリを選択した初期バインディングに手動でキャストする方法があります。

XrmToolBoxには、proposalも含まれていますので、どのアセンブリを使用するかを直接指定できます。

+0

@shytikovに感謝します。このタイプの登録にサポートされていないリソースが使用される可能性があるため、すべてのCWAを分離モードで登録できるかどうかを検討します。 私は自分の質問を編集したので、ダイアログにしか関係していないようです。共通のアセンブリ参照を削除し、基底クラスと各CWAに生成された型をコピーする場合、強力な型を扱えるように "ProxyTypesAssembly"プロパティを設定する必要がありますか? 今後のアップデートで使用できる解決策はありますか?バージョンに影響を与えずにGACアセンブリをアップデートできますか? – Zare

関連する問題