質問

私のWindowsワークフローの活用による授業の立ちたいと思っていまCOMのための自動化を実現しております。私は開Word、Excelから私の授業をします。

私は現在実施IDisposableっCOMヘルパーアプリケーションを整理.ReleaseComObject().ただし、私のワークフローに失敗した場合、Dispose()メわれていて、現在停止しているというのは、WordやExcelで取り扱うあと、私の応募を掲げています。

問題の解決策は非常に簡単ですが、なんの問題を解決したいと思いがあり、より深く理の仕事をします。私は"ベスト"は最も効率的で安全な道を取り扱うライフサイクルのクラスのCOMで。パターン、ベストプラクティスやサンプルコードして下さい。

役に立ちましたか?

解決

できませんか失敗することなく電話の処理()メソッドがあります。また試験の一連のワークフローのみを含むコード活動だけ例外がスローの処理()メソッドの私のワークフローと呼ばれ(ここでは、標準のWorkflowTerminatedイベントハンドラ).チェックには、次のコード:

プログラム。cs

    class Program
    {
        static void Main(string[] args)
        {
            using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
            {
                AutoResetEvent waitHandle = new AutoResetEvent(false);
                workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) 
                {
                    waitHandle.Set();
                };
                workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
                {
                    Console.WriteLine(e.Exception.Message);
                    waitHandle.Set();
                };

                WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication1.Workflow1));
                instance.Start();

                waitHandle.WaitOne();
            }
            Console.ReadKey();
        }
    }

Workflow1.cs

    public sealed partial class Workflow1: SequentialWorkflowActivity
    {
        public Workflow1()
        {
            InitializeComponent();
            this.codeActivity1.ExecuteCode += new System.EventHandler(this.codeActivity1_ExecuteCode);
        }

        [DebuggerStepThrough()]
        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            Console.WriteLine("Throw ApplicationException.");
            throw new ApplicationException();
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                // Here you must free your resources 
                // by calling your COM helper Dispose() method
                Console.WriteLine("Object disposed.");
            }
        }
    }

私何かが足りない?に関するライフサイクル関連法の活動(そしてその結果としてのワークフロー)オブジェクトをご確認くださいこのポスト: 活動は"寿命"の方法.また汎用の条約を廃棄、チェック この.

他のヒント

基本的には、できるとは限らない手コードを呼び出Dispose()おオブジェクト終了時にされています。と思いますようにこっ

MyComHelper helper = new MyComHelper();
helper.DoStuffWithExcel();
helper.Dispose();
...

代わりに利用する必要がありtryブロックを捕例外が発および呼び処分いたします。これは、標準的な方法:

MyComHelper helper = new MyComHelper();
try
{
    helper.DoStuffWithExcel();
}
finally()
{
    helper.Dispose();
}

この なので 共通C#特別の構築を生成する 同じコード [注] 上記のとおり;これは何をやるべきことだと思いほとんどの時間をしている場合を除く一部のオブジェクトを構築意味するマニュアルパターンのように記す):

using(MyComHelper helper = new MyComHelper())
{
    helper.DoStuffWithExcel();
}

編集:
注意:実際に生成されたコードは少し複雑になり、二つ目の例では、上記でも紹介し、新しい地域の範囲は、ヘルパーオブジェクト利用不可の後に using ブロックです。このような場合はコードブロックに囲まれた{}'s.た省略に明確にさにこの機能について説明します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top