`
qzriso
  • 浏览: 242948 次
  • 性别: 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#代码中,`CreateManagedInstance`和`ReleaseManagedInstance`是C++ DLL暴露的函数,用于创建和释放C++的托管对象实例。`InvokeMethod`是一个内部方法,用于调用C++托管对象的方法。 现在,C#代码可以创建...

    c#中的非托管资源释放 (Finalize和Dispose)

    ### C#中的非托管资源释放 (Finalize和Dispose) 在深入了解`Finalize`与`Dispose`之前,我们首先需要理解两个基本概念:托管资源与非托管资源。 #### 托管资源与非托管资源 1. **托管资源**指的是由.NET运行时...

    C#与非托管代码交互操作

    然而,现实的软件开发环境往往涉及到多种技术的混合使用,这包括使用C#和其他非托管代码(如C++、COM组件或者DLL)进行交互。"C#与非托管代码交互操作"这个主题就是探讨如何在C#应用中调用和管理非托管代码资源。 1...

    C#的内存管理:堆、栈、托管堆与指针

    垃圾收集器(Garbage Collector)是 .NET Framework 的一部分,用于释放托管堆中的无用对象,当对象不再使用时,垃圾收集器将释放其所占用的内存空间。垃圾收集器的工作机制是将托管堆中的内存空间压缩,保证可用...

    C#socket通讯两个最经典错误解决方案

    在 C# 编程中,对于非托管资源(如数据库连接、Socket 连接等),程序员必须能够控制其释放过程。这意味着,在使用这些资源后应显式地关闭它们。特别是对于长连接的应用场景,当程序退出时,应当确保所有占用的连接...

    c#调用托管c++调用c++

    标题“c#调用托管c++调用c++”揭示了主要的技术路线:首先,C#代码会通过.NET Framework的托管环境调用C++的托管代码,然后,这部分托管C++代码会进一步调用非托管的C++ DLL。这种技术的应用场景广泛,例如,当需要...

    C#内存释放-线程控制-线程启动-线程暂停

    C#是一种托管环境,意味着开发人员无需手动释放内存。GC会自动检测不再使用的对象,并回收其占用的内存。然而,尽管如此,开发者仍然需要注意避免内存泄漏,例如,确保没有长时间保持对不再需要的对象的引用。此外,...

    C#中动态声明与使用对象数组实例

    在C#中,垃圾回收(Garbage Collection, GC)机制负责自动管理对象的生命周期和内存释放。当一个对象不再被引用时,GC会自动回收其占用的空间。然而,为了优化性能,开发者可以使用`using`语句或显式调用`Dispose()`...

    详解C# 托管资源和非托管资源

    2. **实现Dispose()方法**:在这个方法中,释放托管和非托管资源,并将对象标记为已释放。 3. **实现析构函数**:在析构函数中,仅释放非托管资源,作为释放资源的备份机制,以防`Dispose()`未被调用。 使用时,...

    c# .net 托管代码 之间的关系

    托管代码是在.NET框架下编译的高级语言代码(如C#、VB.NET或F#等)。这些语言编译后的中间语言(Intermediate Language, IL)被加载到CLR,由CLR进行Just-In-Time (JIT)编译成机器码执行。这种机制使得.NET代码能够...

    C#第八章(对象的生命周期)

    本章还介绍了C#的垃圾回收器相关的高级操作,如使用System.GC类通过编程控制垃圾回收器的行为,以及如何通过System.Object.Finalize()虚方法和IDisposable接口来释放对象内部的非托管资源,确保非托管资源的及时释放...

    托管执行环境的介绍-C#学习(2)

    在深入探讨托管执行环境之前,我们首先需要理解什么是.NET Framework。.NET Framework是由Microsoft开发的一个软件框架,它为开发者提供了创建、运行各种类型的应用程序的平台。C#是.NET Framework支持的主要编程...

    C#创建、销毁对象和继承

    然而,对于处理非托管资源(如文件句柄或数据库连接)的对象,应使用`using`语句或实现`IDisposable`接口来确保资源的正确释放。 “资源管理”是一个关键点,特别是当涉及到系统资源。C#通过垃圾收集器自动管理内存...

    带你复习c# 托管和非托管资源

    c# 托管和非托管资源是两个不同的概念,托管资源可以自动释放内存,而非托管资源需要手动管理内存。垃圾回收机制是 .NET 平台的一种机制,用于释放不再使用的托管资源。了解托管资源和非托管资源的知识点,可以帮助...

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

    总的来说,对于C#中的非托管对象,我们应该尽量使用 Dispose 模式来释放资源,而不是完全依赖于Finalize。这是因为Dispose模式不仅提供了更精确的资源管理,而且在性能上也优于Finalize。同时,理解垃圾回收的工作...

    C# 阐述面向对象的讲义

    C#中的析构函数以~开头,通常用于释放非托管资源。 四、访问修饰符 C#提供了四种访问修饰符: - public:所有地方都可以访问。 - private:在同一类内可以访问。 - protected:在同一类和其子类中可以访问。 - ...

    c#释放内存

    在C#编程环境中,内存管理是一项至关重要的任务。与C++等其他语言不同,C#采用了垃圾回收机制来自动管理对象的生命周期,但这并不意味着开发者可以完全忽视内存管理的问题。在某些特定情况下,如长时间运行的应用...

    C#面向对象程序设计

    “析构函数”则与构造函数相反,它在对象生命周期结束时执行,通常用于释放非托管资源。在C#中,析构函数以~符号开头,但应谨慎使用,因为垃圾回收机制通常能妥善处理资源释放。 实例讲解在学习过程中至关重要,...

    使用托管C++粘合C#和C++代码.pdf

    "使用托管C++粘合C#和C++代码" 本文档主要介绍使用托管C++将C#和C++代码进行集成的方法。在这个例子中,我们将使用托管C++创建一个动态链接库(DLL),并将纯C++静态库中的类封装在托管类中,从而实现C#和C++代码的...

    C#中托管DLL和非托管DLL的区别详解

    首先解释一下,托管DLL和非托管DLL的区别。...C# 调用非托管DLL文件。DLL文件是用C语言编写的。 托管DLL就是能够在公共语言运行库(Common Language Runtime,简称CLR)中能够直接引用的,并且扩展名为“DL

Global site tag (gtag.js) - Google Analytics