开发小组在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#代码中,`CreateManagedInstance`和`ReleaseManagedInstance`是C++ DLL暴露的函数,用于创建和释放C++的托管对象实例。`InvokeMethod`是一个内部方法,用于调用C++托管对象的方法。 现在,C#代码可以创建...
### C#中的非托管资源释放 (Finalize和Dispose) 在深入了解`Finalize`与`Dispose`之前,我们首先需要理解两个基本概念:托管资源与非托管资源。 #### 托管资源与非托管资源 1. **托管资源**指的是由.NET运行时...
然而,现实的软件开发环境往往涉及到多种技术的混合使用,这包括使用C#和其他非托管代码(如C++、COM组件或者DLL)进行交互。"C#与非托管代码交互操作"这个主题就是探讨如何在C#应用中调用和管理非托管代码资源。 1...
垃圾收集器(Garbage Collector)是 .NET Framework 的一部分,用于释放托管堆中的无用对象,当对象不再使用时,垃圾收集器将释放其所占用的内存空间。垃圾收集器的工作机制是将托管堆中的内存空间压缩,保证可用...
在 C# 编程中,对于非托管资源(如数据库连接、Socket 连接等),程序员必须能够控制其释放过程。这意味着,在使用这些资源后应显式地关闭它们。特别是对于长连接的应用场景,当程序退出时,应当确保所有占用的连接...
标题“c#调用托管c++调用c++”揭示了主要的技术路线:首先,C#代码会通过.NET Framework的托管环境调用C++的托管代码,然后,这部分托管C++代码会进一步调用非托管的C++ DLL。这种技术的应用场景广泛,例如,当需要...
C#是一种托管环境,意味着开发人员无需手动释放内存。GC会自动检测不再使用的对象,并回收其占用的内存。然而,尽管如此,开发者仍然需要注意避免内存泄漏,例如,确保没有长时间保持对不再需要的对象的引用。此外,...
在C#中,垃圾回收(Garbage Collection, GC)机制负责自动管理对象的生命周期和内存释放。当一个对象不再被引用时,GC会自动回收其占用的空间。然而,为了优化性能,开发者可以使用`using`语句或显式调用`Dispose()`...
2. **实现Dispose()方法**:在这个方法中,释放托管和非托管资源,并将对象标记为已释放。 3. **实现析构函数**:在析构函数中,仅释放非托管资源,作为释放资源的备份机制,以防`Dispose()`未被调用。 使用时,...
托管代码是在.NET框架下编译的高级语言代码(如C#、VB.NET或F#等)。这些语言编译后的中间语言(Intermediate Language, IL)被加载到CLR,由CLR进行Just-In-Time (JIT)编译成机器码执行。这种机制使得.NET代码能够...
本章还介绍了C#的垃圾回收器相关的高级操作,如使用System.GC类通过编程控制垃圾回收器的行为,以及如何通过System.Object.Finalize()虚方法和IDisposable接口来释放对象内部的非托管资源,确保非托管资源的及时释放...
在深入探讨托管执行环境之前,我们首先需要理解什么是.NET Framework。.NET Framework是由Microsoft开发的一个软件框架,它为开发者提供了创建、运行各种类型的应用程序的平台。C#是.NET Framework支持的主要编程...
然而,对于处理非托管资源(如文件句柄或数据库连接)的对象,应使用`using`语句或实现`IDisposable`接口来确保资源的正确释放。 “资源管理”是一个关键点,特别是当涉及到系统资源。C#通过垃圾收集器自动管理内存...
c# 托管和非托管资源是两个不同的概念,托管资源可以自动释放内存,而非托管资源需要手动管理内存。垃圾回收机制是 .NET 平台的一种机制,用于释放不再使用的托管资源。了解托管资源和非托管资源的知识点,可以帮助...
总的来说,对于C#中的非托管对象,我们应该尽量使用 Dispose 模式来释放资源,而不是完全依赖于Finalize。这是因为Dispose模式不仅提供了更精确的资源管理,而且在性能上也优于Finalize。同时,理解垃圾回收的工作...
C#中的析构函数以~开头,通常用于释放非托管资源。 四、访问修饰符 C#提供了四种访问修饰符: - public:所有地方都可以访问。 - private:在同一类内可以访问。 - protected:在同一类和其子类中可以访问。 - ...
在C#编程环境中,内存管理是一项至关重要的任务。与C++等其他语言不同,C#采用了垃圾回收机制来自动管理对象的生命周期,但这并不意味着开发者可以完全忽视内存管理的问题。在某些特定情况下,如长时间运行的应用...
“析构函数”则与构造函数相反,它在对象生命周期结束时执行,通常用于释放非托管资源。在C#中,析构函数以~符号开头,但应谨慎使用,因为垃圾回收机制通常能妥善处理资源释放。 实例讲解在学习过程中至关重要,...
"使用托管C++粘合C#和C++代码" 本文档主要介绍使用托管C++将C#和C++代码进行集成的方法。在这个例子中,我们将使用托管C++创建一个动态链接库(DLL),并将纯C++静态库中的类封装在托管类中,从而实现C#和C++代码的...
首先解释一下,托管DLL和非托管DLL的区别。...C# 调用非托管DLL文件。DLL文件是用C语言编写的。 托管DLL就是能够在公共语言运行库(Common Language Runtime,简称CLR)中能够直接引用的,并且扩展名为“DL