office二次开发,Com对象自动释放

office的每个对象引用必须要显示释放,才能将所有内存释放,自动关闭office进程。
类似于下面的代码:
Chart.Title.Text=”test”;
Title对象是无法释放的,我们必须写成:
Chart chart=GetChartObj(Name);
Title title=Chart.Title;
Title.Text=”test”;
Marshal.FinalReleaseComObject(title); 
Marshal.FinalReleaseComObject(chart); 
也就是对每个对象的访问,必须经过ReleaseComObject()才可以关闭office进程。
下边的就解决这个问题。
 /// <summary>
    /// Com封装对象,用于com对象的释放
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <author>
    /// tang jing bo
    /// </author>
    /// <remarks>
    /// tangj15 2011-11-4
    /// </remarks>
    public class ComWrap<T> : Releasable where T : class
    {
        private T _needReleaseObj;
        private bool disposed;

        /// <summary>
        /// Initializes a new instance of the <see cref="ComWrap&lt;T&gt;"/> class.
        /// </summary>
        /// <param name="needReleaseObj">The need release obj.</param>
        public ComWrap(T needReleaseObj)
        {
            _needReleaseObj = needReleaseObj;
        }

        /// <summary>
        /// 获取Com对象引用
        /// </summary>
        public T Target
        {
            get { return _needReleaseObj; }
        }

        /// <summary>
        /// Performs an explicit conversion from <see cref="T"/> to <see cref="System.ComWrap&lt;T&gt;"/>.
        /// </summary>
        /// <param name="comObject">The COM object.</param>
        /// <returns>
        /// The result of the conversion.
        /// </returns>
        public static explicit operator ComWrap<T>(T comObject)
        {
            return new ComWrap<T>(comObject);
        }

        /// <summary>
        /// Performs an implicit conversion from <see cref="System.ComWrap&lt;T&gt;"/> to <see cref="T"/>.
        /// </summary>
        /// <param name="wrap">The wrap.</param>
        /// <returns>
        /// The result of the conversion.
        /// </returns>
        public static implicit operator T(ComWrap<T> wrap)
        {
            return wrap.Target;
        }
        /// <summary>
        /// Wraps the specified COM object.
        /// </summary>
        /// <param name="comObject">The COM object.</param>
        /// <returns></returns>
        public static ComWrap<T> Wrap(T comObject)
        {
            return new ComWrap<T>(comObject);
        }

        /// <summary>
        /// Releases unmanaged and - optionally - managed resources
        /// </summary>
        /// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
        protected override void Dispose(bool disposing)
        {
            if (!disposed)
            {
                try
                {
                    if (disposing)
                    {
                    }
                    if (_needReleaseObj != null)
                    {
                        Marshal.FinalReleaseComObject(_needReleaseObj);
                        _needReleaseObj = null;
                    }
                    disposed = true;
                }
                finally
                {
                    // Call Dispose on your base class.
                    base.Dispose(disposing);
                }
            }
        }

再写一个扩展类方便com对象的封装调用

/// <summary>
    /// Com释放扩展
    /// </summary>
    /// <author>
    /// Tang Jing bo
    /// </author>
    /// <remarks>
    /// tangj15 2011-11-4
    /// </remarks>
    public static class ComObjectDisposeExtension
    {
        /// <summary>
        /// 返回将Com组件包装后对象,需要显示的调用Dispose()方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="comObject">The COM object.</param>
        /// <returns></returns>
        public static ComWrap<T> Wrap<T>(this T comObject) where T : class
        {
            return new ComWrap<T>(comObject);
        }
        /// <summary>
        /// 返回将Com组件包装后对象,需要显示的调用Dispose()方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="comObject">The COM object.</param>
        /// <returns></returns>
        public static ComWrap<T> Wrap<T>(this object comObject) where T : class
        {
            return new ComWrap<T>((T)comObject);
        }
        /// <summary>
        /// 将Com组件包装后,执行action的代码,并且执行完后自动释放
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="comObject">The COM object.</param>
        /// <param name="action">The action.</param>
        public static void WrapRun<T>(this T comObject, Action<ComWrap<T>> action) where T : class
        {
            using (var o = new ComWrap<T>(comObject))
                action(o);
        }
        /// <summary>
        /// 将Com组件包装后,执行action的代码,并且执行完后自动释放
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="comObject">The COM object.</param>
        /// <param name="action">The action.</param>
        public static void WrapRun<T>(this object comObject, Action<ComWrap<T>> action) where T : class
        {
            WrapRun((T)comObject, action);
        }
        /// <summary>
        /// 将Com组件包装后,执行并返回func的值,返回前自动释放com对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="TRet">The type of the ret.</typeparam>
        /// <param name="comObject">The COM object.</param>
        /// <param name="func">The func.</param>
        /// <returns></returns>
        public static TRet WrapGet<T, TRet>(this T comObject, Func<ComWrap<T>, TRet> func) where T : class
        {
            using (var o = new ComWrap<T>(comObject))
                return func(o);
        }

        /// <summary>
        /// 将Com组件包装后,执行并返回func的值,返回前自动释放com对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="TRet">The type of the ret.</typeparam>
        /// <param name="comObject">The COM object.</param>
        /// <param name="func">The func.</param>
        /// <returns></returns>
        public static TRet WrapGet<T, TRet>(this object comObject, Func<ComWrap<T>, TRet> func) where T : class
        {
            return WrapGet((T)comObject,func);
        }
    }
 
我们可以这样调用:

using (ComWrap<Slides> slides = Presentation.Target.Slides.Wrap())
            {

//….

}

也可以使用扩展方法:

Presentation.Target.Slides.WrapRun(slide=>{..do});

转载于:https://www.cnblogs.com/68681395/archive/2011/11/24/2262147.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、Office2000 下内部COM插件的编程实现.................................................................................2 1.1、版权声明..........................................................................................................................2 1.2、内容详情..........................................................................................................................2 2、用VC6.0 编写Word插件..........................................................................................................11 2.1、版权声明........................................................................................................................11 2.2、内容详情........................................................................................................................11 3、探索 Word 2007 开发.............................................................................................................19 3.1、版权声明........................................................................................................................19 3.2、内容详情........................................................................................................................19 3.2.1 我的博客...............................................................................................................19 3.2.2 扩展 Ribbon.........................................................................................................28 3.2.3 管理侧栏...............................................................................................................43 3.2.4 上传图片...............................................................................................................49 3.2.5 部署插件...............................................................................................................56 4、用VC6.0 编写Word插件(Office2007 篇).................................................................................66 4.1、版权声明........................................................................................................................66 4.2、内容详情........................................................................................................................66 5、Microsoft Word 语法高亮插件(v1.2) ................................................................................70 5.1、版权声明........................................................................................................................70 5.2、内容详情........................................................................................................................70 6、VSTO学习笔记........................................................................................................................75 6.1、版权声明........................................................................................................................75 6.2、内容详情........................................................................................................................75 6.2.1 VSTO概述.............................................................................................................75 6.2.2 Excel对象模型.......................................................................................................89 6.2.3 开发Office 2010 64 位COM加载项...................................................................101 6.2.4 从SharePoint 2010 中下载文件.........................................................................117 6.2.5 批量编辑Excel 2010 x64....................................................................................123 6.2.6 在 Excel 2010 中使用RDLC报表.....................................................................131 7、Excel 二次开发系列..............................................................................................................137 7.1、版权声明......................................................................................................................137 7.2、内容详情......................................................................................................................137 7.2.1 Excel 编成模型...................................................................................................137 7.2.2 Excel 常用操作(创建、打开、读取、写入)...............................................139 7.2.3 创建Excel二次开发环境....................................................................................142 7.2.4 操作一个已经存在Excel....................................................................................143 7.2.5 插件开发系列操作.............................................................................................145 7.2.6 引用Excel模板....................................................................................................172 7.2.7 报表服务基础.....................................................................................................174 7.2.8 报表服务实例.....................................................................................................178
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值