代码之家  ›  专栏  ›  技术社区  ›  Robert S.

使用COM互操作处理对象生命周期的最有效方法是什么?

  •  0
  • Robert S.  · 技术社区  · 16 年前

    我有一个Windows工作流应用程序,它使用我为COM自动化编写的类。我正在用COM从我的课上打开Word和Excel。

    我目前正在我的COM助手中实现IDisposable,并使用marshal.releaseComObject()。但是,如果我的工作流失败,则不会调用Dispose()方法,并且Word或Excel句柄保持打开状态,应用程序挂起。

    这个问题的解决方案非常简单,但我不想仅仅解决它,我想学习一些东西,并深入了解与COM合作的正确方式。我正在寻找处理拥有COM句柄的类的生命周期的“最佳”或最有效和最安全的方法。模式、最佳实践或示例代码将是有用的。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Panos    16 年前

        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();
            }
        }
    

        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.");
                }
            }
        }
    

    Activity "Lifetime" Methods this

        2
  •  0
  •   Euro Micelli    16 年前

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

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

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


    using