プラグインを作成し、登録ツールを使用して登録しました。インスタンス作成のメッセージを処理するステップも追加しました。残念ながら、意図した動作は発生しません。
私の推測では、プラグイン内の何かがクラッシュしますが、それをデバッグする方法がわかりません。ブレークポイントの設定は、オンライン バージョンではうまくいかないことはわかっているので、試していません。
法律上および技術上の理由から、ソリューションをオンプレミス インストールに移行することもできません。私の唯一のオプションを推測していますか?
プラグインを作成し、登録ツールを使用して登録しました。インスタンス作成のメッセージを処理するステップも追加しました。残念ながら、意図した動作は発生しません。
私の推測では、プラグイン内の何かがクラッシュしますが、それをデバッグする方法がわかりません。ブレークポイントの設定は、オンライン バージョンではうまくいかないことはわかっているので、試していません。
法律上および技術上の理由から、ソリューションをオンプレミス インストールに移行することもできません。私の唯一のオプションを推測していますか?
サーバー側(プラグイン)の場合、ITracingServiceを使用しています。クライアント側では、すべてをコンソールに記録します。最初の欠点は、何かを表示するために実際に実行をクラッシュさせる必要があることです。後者の欠点は、GUIがまったく呼び出されずにプラグインが実行されることがあることです。
より重いプロジェクトに関しては、プラグインから呼び出してそれに書き込むWCFWebサービスを設定するだけです。そうすれば、一方の画面でプラグインを実行し、もう一方の画面で素敵なログファイルを取得します(または送信した情報を画面に表示します)。
にもアクセスできることを忘れないでくださいITracingService。
メソッドでそれへの参照を取得Executeし、コードで頻繁に書き込み、試行中または成功した変数または一連のアクションをログに記録できます。また、例外が発生したときに、より価値のある情報を表示するためにも使用できます。
基本的には、コンソールへの書き込みに似ています。次に、何らかの原因で実行時にプラグインがクラッシュした場合、ユーザーに表示されたエラーで[ログ ファイルのダウンロード]をクリックすると、追跡したすべての情報を確認できます。
ただし、注意してください - プラグインが実際に例外をスローしない限り(故意またはその他の方法で)、トレースされたものにアクセスすることはできません。
public void Execute(IServiceProvider serviceProvider)
{
// Obtain the execution context from the service provider.
IPluginExecutionContext context =
(IPluginExecutionContext)serviceProvider.GetService(
typeof(IPluginExecutionContext));
// Get a reference to the tracing service.
ITracingService tracingService =
(ITracingService)serviceProvider.GetService(typeof(ITracingService));
try
{
tracingService.Trace("Getting entity from InputParameters...");
// may fail for some messages, since "Target" is not present
var myEntity = (Entity)context.InputParameters["Target"];
tracingService.Trace("Got entity OK");
// some other logic here...
}
catch (FaultException<OrganizationServiceFault> ex)
{
_trace.Trace(ex.ToString());
while (ex.InnerException != null)
{
ex = (FaultException<OrganizationServiceFault>)ex.InnerException;
_trace.Trace(ex.ToString());
}
throw new InvalidPluginExecutionException(
string.Format("An error occurred in your plugin: {0}", ex));
}
catch (Exception ex)
{
_trace.Trace(ex.ToString());
while (ex.InnerException != null)
{
ex = ex.InnerException;
_trace.Trace(ex.ToString());
}
throw;
}
}
たとえば、作成中のエンティティのインスタンスのフィールドの非常に基本的な更新から始めることができます。それが機能している場合は、いつでも最後に機能していたバージョンに戻すことができます。それでもうまくいかない場合は、おそらく、プラグインの登録が正しく設定されていないことを意味します。
非常に効率的な方法は、ソリューションを完全に制御できるオンプレミス バージョンに移行することですが、あなたの質問ではそれがオプションではないことがわかります。
ソリューションをオンプレミス バージョンに引き上げることができる場合に備えて、プラグインをデバッグする方法に関するリンクを次に示します。