`
ruilinruirui
  • 浏览: 1049971 次
文章分类
社区版块
存档分类
最新评论

微软Marshal.ReleaseComObject 方法的来龙去脉

 
阅读更多

目的:研究了很多微软调用COM 对象或者ActiveX控件的范例,都很少有用到Marshal.ReleaseComObject 方法。因此,对超图范例频繁使用该方法的原因产生了好奇。所以花2天时间集中研究了一下。

定义:递减所提供的运行库可调用包装的引用计数。

但实际上因为无论调用包装 COM 对象的托管客户端有多少,.net运行库可调用包装仅保留对该对象的一次引用。所以这个方法将导致.net运行库释放非托管 COM 对象上的所有引用。

(白话解释下:COM对象与.NET环境处理内存的机制不同,所以要让老的COM东东能够在新的.NET环境运行,必须给COM对象包装一下,让她打扮成.NET对象的样子。但有的东西是COM特有的,比如引用计数,这是COM对象处理内存的方法,有人调用我就+1,这样6个人在用我,引用计数=6;当计数=0的时候,表示没人用我啦,于是羞愧而自杀,从内存中消失。但.NET环境不是这样处理,所有事情都由自动啦。新老东西打交道的时候,.NET说,COM老弟,你还是自己管你自己吧。于是,在.NET环境调用COM对象,比如必须让ActiveX控件自己在没人用的时候识相的走人。当然我们编程人员希望能够控制拉,这时候就是显式控制。微软提供的Marshal.ReleaseComObject 方法,就是让我们显示控制COM对象的生存。你调用这个方法,就是通过.NET环境,告诉COM对象,不用你了,马上消失。)

用途:此方法用于显式控制从托管代码使用的 COM 对象的生存期。应及时(或者在对象按指定的顺序必须释放时)使用此方法,来释放引用某些资源的基础 COM 对象。
还有隐式控制,在代码嵌套结束时自动释放。就像for循环中的int i = 0;变量一样,出了循环代码段,int i自动消失。如果你在循环中调用一个COM对象,那就不用显示控制释放。系统自动解决。在其它代码段的嵌套情况下一样。我想我看到的很多微软的范例,都是这种隐式控制的方法吧。例如很多朋友用SuperMap时会遇到时有时无的故障。在不知不觉间用了隐式控制感觉没有问题;有时候恰好调用COM的代码没有隐式处理,所以出现故障。

COM对象与.NET的交互是牵扯到多方面的知识,是一个复杂的庞大话题。有兴趣的话可以MSDN研究下。在与COM对象打交道的时候,最好把更多的精力投入到体会其体系结构方面。

[摘自:http://www.diybl.com/course/4_webprogram/asp.net/netjs/20090311/160442.html]

分享到:
评论

相关推荐

    C#利用com操作excel释放进程的解决方法

    代码如下:System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets); System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet); System.Runtime.InteropServices.Marshal.ReleaseComObject...

    vb 版 word.bll

    System.Runtime.InteropServices.Marshal.ReleaseComObject(mobjDoc) mobjDoc = Nothing End If If Not mWordapp Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(mWordapp) ...

    pyc-grammar:从marshal.c检索.pyc字节码的语法描述

    派克语法 从marshal.c生成.pyc字节码的语法描述。

    c# ini读写操作

    IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER * sizeof(char)); uint bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, iniFile); if (bytesReturned != 0) {...

    C#关闭Excel进程

    之前用System.Runtime.InteropServices.Marshal.ReleaseComObject, GC回收Excel进程...但最后总是没办法关闭Excel进程.现采用强制Kill掉进程.总算达到预期效果了..与大家分享.

    Marshal类的PtrToStructure

    PtrToStructure,将数据从非托管内存块封送到新分配的指定类型的托管对象 应用:MFC发送消息到WPF界面上 public IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) ...

    strazegy-marshal.rar_The Network

    Some routines, about the neural network control in need can reference, can good source

    marshal.rar

    COM组件之间跨进程调用需要用到marshal(数据封送),这个例子说明如何进行这个过程

    动态改变IP

    IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI)); // Converting structure to IntPtr Marshal.StructureToPtr(struct_IPI, intptrStruct, true); bool iReturn = ...

    ruby-marshal:Haskell库,用于解析使用Marshal.dump序列化的Ruby对象的子集

    Haskell库用于解析使用Marshal.dump序列化的Ruby对象的子集。 支持的类型 NilClass TrueClass | FalseClass Array Fixnum Float Hash String Symbol 如果您想增加对其他类型的支持,请随时使用以下准则创建...

    python使用marshal模块序列化实例

    本文实例讲述了python使用marshal模块序列化的方法,分享给大家供大家参考。具体方法如下: 先来看看下面这段代码: import marshal data1 = ['abc',12,23,'jb51'] #几个测试数据 ...marshal.dump(da

    EnumAVDevice.dll 获取系统中音视频设备名称

    C++ dll 可用C#调用 //获取系统中音视频设备名,和FFmpeg名字完全... System.Diagnostics.Debug.WriteLine($"====>>{Marshal.PtrToStringAuto(dev[i])}"); for (int i = 0; i ; i++) Marshal.FreeHGlobal(dev[i]);

    人工智能-项目实践-数据预处理-利用Python网络爬虫对京东商城中指定商品下的用户评论进行爬取,对数据预处理操作后进行文本情感

    找到外部库中snownlp中sentiment模块,将训练得到的sentiment.marshal.3文件覆盖sentiment模块中自带的sentiment.marshal.3 情感分析(sentiment.analysis.py) 启动sentiment.analysis.py 开始对jd_comment.csv中...

    ini读写操作

    ini读写操作

    vlc C# vs2013

    用c#调用vlc开源播放器 dll库 做成的简单播放器 有源码 文件已包含 vlc的dll vs2013下直接运行

    C# 中改变显示器的分辨率和刷新频率

    dm.dmSize= (short)Marshal.SizeOf(typeof(DEVMODE)); dm.dmPelsWidth = 1024; dm.dmPelsHeight= 768; dm.dmDisplayFrequency=85; dm.dmFields = DEVMODE.DM_PELSWIDTH | DEVMODE.DM_PELSHEIGHT | DEVMODE.DM_...

    c# CF 拨打电话

    phoneaddr.AddressType = (AddressType)Marshal.ReadInt32((IntPtr)pCurrent); pCurrent += Marshal.SizeOf(phoneaddr.AddressType); phoneaddr.Address = Marshal.PtrToStringUni((IntPtr)pCurrent); } ...

    ztf-variable-marshal:ZTF的可变元帅

    pip install git+https://github.com/dmitryduev/ztf-variable-marshal.git zvm非常轻巧,仅取决于pymongo和requests 。 有关如何以编程方式与ZVM交互的教程: 请参阅,或者 生产服务 设定说明 先决条件 将仓库和...

    C# 中实现短信发送的类

    Marshal.Copy(smsAddressTag, 0, smsAddress, smsAddressTag.Length); // Set provider data structure byte[] dwMessageOptions = BitConverter.GetBytes(PS_MESSAGE_OPTION_NONE); byte[] psMessageClass = ...

    AspriseOCR 4.0破解dll

    AspriseOCR 4.0破解dll是由VC...Marshal.PtrToStringAnsi(OCRpart(PicturePath , -1, startX, startY, width, height));//返回值为字符串 return Marshal.PtrToStringAnsi(OCRpart(PicturePath, -1, 0, 0, 900, 200));

Global site tag (gtag.js) - Google Analytics