`
qzriso
  • 浏览: 237010 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

C#托管环境下释放COM对象

    博客分类:
  • c#
阅读更多

开发小组在VS2005 c++环境中,使用ATL编写了一组COM组件,在VS 2005 C#项目中引入后使用,浏览地图,使用一段

时间后,发现无法正常显示地图了,显示有些线无法绘制、然后一些多边形无法绘制...最后整个地图不显示了。

debug后发现,GDI对象无法创建,已创建的GDI对象没有释放。

在VC++开发环境中调用组件时,一旦脱离组件对象的生命周期,组件对象便会自动释放,而在VS2005 C#开发环境中,组件对象则会长时间驻留内存,而没有释放资源。

如果这个组件对象创建时,自动构建了一个GDI对象,而在组建对象析构才自动销毁这个GDI对象。在这种实现逻辑下,在VS 2005 C#环境中调用组件则会出现资源泄漏。

怎么解决?

1、主动调用GC.Collect();

     这种方法太耗时----不用用户主动管理的对象也会被释放,对内存也进行了整理;

2、int System.Runtime.InteropServices.Marshal.ReleaseComObject(object o)

     此方法调用前,必须没有地方使用COM对象,所有对COM对象的引用都置为null。

我个人还是倾向第二种方法,有点像VC中使用组件时,调用.Release(),还是自己掌握对象的存续时间感觉好啊

参考:  http://blog.csdn.net/sukhoeing/archive/2007/07/23/1703246.aspx这里详细说明了COM与CLR间的关系。

分享到:
评论

相关推荐

    C#清理非托管对象实例分析

    主要介绍了C#清理非托管对象的方法,结合实例形式详细分析了C#清理非托管对象释放资源的相关原理与实现技巧,需要的朋友可以参考下

    c#的GC垃圾回收机制详细讲解文档

    首先:谈谈托管,什么叫托管,我的理解就是托付C#运行环境帮我们去管理,在这个运行环境中可以帮助我们开辟内存和释放内存,开辟内存一般用new,内存是随机分配的,释放主要靠的是GC也就是垃圾回收机制。哪么有两个...

    C#资源释放方法实例分析

    本文实例讲述了C#资源释放方法。分享给大家供大家参考,具体如下: 1、try{}finally{} 2、using 只有类型实现了IDisposable接口并且重写Dispose()方法可以使用...当不再使用托管对象时,垃圾回收器会自动释放分配给该对

    探讨C#中Dispose方法与Close方法的区别详解

    简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类:托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象;非托管资源:不受CLR管理的对象,windows内核对象,如文件、数据库连接、套接字、

    C#内存管理简介在C#中,虚拟内存中有个两个存储变量的区域,一个称为堆栈,一个称为托管堆

    在C#中,虚拟内存中有个两个存储变量的区域,一个称为堆栈,一个称为托管堆,托管堆的出现是.net不同于其他语言的地方,堆栈存储值类型数据,而托管堆存储引用类型如类、对象,并受垃圾收集器的控制和管理 当对象被...

    C#多线程开发多个实例

    //通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,据说那样会降低效率 void IDisposable.Dispose() { Dispose(true); } //将释放非托管资源设计成一个虚函数,提供在继承类中释放基类的...

    .net非托管资源的回收方法

    释放未托管的资源有两种方法   1、析构函数 2、实现System.IDisposable接口   一、析构函数  构造函数可以指定必须在创建类的实例时进行的某些操作,在垃圾收集器删除对象时,也可以调用析构函数。析构函数初看...

    纯真IP数据库查询模块源代码参考(C#)

    有些朋友在C#中使用动态类对象的构造函数/析构函数在对象的初始化/释放时来打开/关闭数据文件,这虽然是一个很好的面向的思想,但托管程序对象的释放时间是不确定的,尤其是ASP.NET的使用,这一方面由于打开的文件未...

    C#实训教程

    10.5 释放未托管的资源 195 10.6 析构函数 195 10.7 IDisposable接口 196 10.8 实现IDisposable接口和析构函数 198 10.9 不安全的代码 199 10.10 指针 200 10.11 使用指针优化性能 213 10.12 内容总结 217 ...

    分享我在工作中遇到的多线程下导致RCW无法释放的问题

    最近在做项目中遇到一个问题,在调用一个类库中的方法时,出现如下异常信息:尝试释放正在使用的RCW,活动线程或其他线程上正在使用该 RCW,释放正在使用的 RCW 的尝试会导致损坏或数据丢失

    CLR.via.C#.(中文第3版)(自制详细书签)

    CLR.via.C#.(中文第3版)(自制详细书签)Part2 CLR via C#(第3版) Jeffrey Richter 著 周靖 译 出版时间:2010年09月 页数:800 介绍 享有全球盛誉的编程专家Jeffrey Richter,这位与Microsoft .NET开发团队...

    C#线程锁介绍源码

    lock和Monitor是.NET用一个特殊结构实现的,Monitor对象是完全托管的、完全可移植的,并且在操作系统资源要求方 面可能更为有效,同步速度较快,但不能跨进程同步。lock(Monitor.Enter和Monitor.Exit方法的封装)...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    CLR.via.C#.(中文第3版)(自制详细书签)Part2 CLR via C#(第3版) Jeffrey Richter 著 周靖 译 出版时间:2010年09月 页数:800 介绍 享有全球盛誉的编程专家Jeffrey Richter,这位与Microsoft .NET开发团队合作...

    c# 加密和解密相关代码

    (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为Encrypt。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个GroupBox 容器控件,其中, 在第一个GroupBox 中放...

Global site tag (gtag.js) - Google Analytics