目的:研究了很多微软调用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]
分享到:
相关推荐
代码如下:System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets); System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet); System.Runtime.InteropServices.Marshal.ReleaseComObject...
System.Runtime.InteropServices.Marshal.ReleaseComObject(mobjDoc) mobjDoc = Nothing End If If Not mWordapp Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(mWordapp) ...
派克语法 从marshal.c生成.pyc字节码的语法描述。
IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER * sizeof(char)); uint bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, iniFile); if (bytesReturned != 0) {...
之前用System.Runtime.InteropServices.Marshal.ReleaseComObject, GC回收Excel进程...但最后总是没办法关闭Excel进程.现采用强制Kill掉进程.总算达到预期效果了..与大家分享.
PtrToStructure,将数据从非托管内存块封送到新分配的指定类型的托管对象 应用:MFC发送消息到WPF界面上 public IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) ...
Some routines, about the neural network control in need can reference, can good source
COM组件之间跨进程调用需要用到marshal(数据封送),这个例子说明如何进行这个过程
IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI)); // Converting structure to IntPtr Marshal.StructureToPtr(struct_IPI, intptrStruct, true); bool iReturn = ...
Haskell库用于解析使用Marshal.dump序列化的Ruby对象的子集。 支持的类型 NilClass TrueClass | FalseClass Array Fixnum Float Hash String Symbol 如果您想增加对其他类型的支持,请随时使用以下准则创建...
本文实例讲述了python使用marshal模块序列化的方法,分享给大家供大家参考。具体方法如下: 先来看看下面这段代码: import marshal data1 = ['abc',12,23,'jb51'] #几个测试数据 ...marshal.dump(da
C++ dll 可用C#调用 //获取系统中音视频设备名,和FFmpeg名字完全... System.Diagnostics.Debug.WriteLine($"====>>{Marshal.PtrToStringAuto(dev[i])}"); for (int i = 0; i ; i++) Marshal.FreeHGlobal(dev[i]);
找到外部库中snownlp中sentiment模块,将训练得到的sentiment.marshal.3文件覆盖sentiment模块中自带的sentiment.marshal.3 情感分析(sentiment.analysis.py) 启动sentiment.analysis.py 开始对jd_comment.csv中...
ini读写操作
用c#调用vlc开源播放器 dll库 做成的简单播放器 有源码 文件已包含 vlc的dll vs2013下直接运行
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_...
phoneaddr.AddressType = (AddressType)Marshal.ReadInt32((IntPtr)pCurrent); pCurrent += Marshal.SizeOf(phoneaddr.AddressType); phoneaddr.Address = Marshal.PtrToStringUni((IntPtr)pCurrent); } ...
pip install git+https://github.com/dmitryduev/ztf-variable-marshal.git zvm非常轻巧,仅取决于pymongo和requests 。 有关如何以编程方式与ZVM交互的教程: 请参阅,或者 生产服务 设定说明 先决条件 将仓库和...
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是由VC...Marshal.PtrToStringAnsi(OCRpart(PicturePath , -1, startX, startY, width, height));//返回值为字符串 return Marshal.PtrToStringAnsi(OCRpart(PicturePath, -1, 0, 0, 900, 200));