【问题标题】:destroy/release .NET component in COM interface在 COM 接口中销毁/释放 .NET 组件
【发布时间】:2014-07-10 15:26:14
【问题描述】:

我不习惯 COM,但我需要使用 C# 创建一个 .NET 组件,以编译为用于另一个程序套件的 dll,所以我将其作为 COM 对象(注册 COM 互操作和程序集)对 COM 等可见。)

假设我有我的接口类:

using System.Runtime.InteropServices;

namespace Test
{
 public interface IFoo
 {
  void method1(parameter1);
  void method2 (parameter2);
 }
 [ComVisible(true),ClassInterface(ClassInterfaceType.None)]
 public class myname : IFoo
 {
   FooClass class;
   public myname()//Constructor
   {
   }
   public void method1(parameter1)
   {
     class = new FooClass();
     class.Method1(parameter1);
    }
 }
}

在此之后,我编译它并使用 regasm 在另一台计算机上注册 dll。我运行它,但是这个应用程序消耗大量内存并且永远不会释放自己,有谁知道释放/销毁它的方法吗?

问题是如何释放内存使用量?提前致谢

【问题讨论】:

标签: c# .net memory com


【解决方案1】:

通过COM调用.NET,内存泄漏通常发生在COM Callable Wrapper层。

当 COM 客户端调用 .NET 对象时,公共语言运行时会为该对象创建托管对象和 COM 可调用包装器 (CCW)。无法直接引用 .NET 对象,COM 客户端使用 CCW 作为托管对象的代理。

CCW 以传统的 COM 方式进行引用计数。当 CCW 上的引用计数达到零时,包装器释放其对托管对象的引用。在下一个垃圾收集周期中收集没有剩余引用的托管对象。所以如果一个对象的引用计数没有减少到0,那就是有泄漏

最近我也在处理同样的案例,根据我的经验,你应该:

  1. 检查您是否在本机代码中使用 COM 智能指针类型。当您使用#import xxx.tlb 时,编译器会创建如下代码:

    _COM_SMARTPTR_TYPEDEF(IFoo, __uuidof(IFoo));

    当你在你的C++代码中使用IFoo接口时,你应该使用IFooPtr,这是一个COM智能指针类型,当变量超出范围时会调用Release()函数。

  2. SAFEARRAY 的用法。当您从 C# 返回一个数组时,它将作为 SAFEARRAY * 类型返回给 C++,您必须在该安全数组上调用 SafeArrayDestory() 以释放内存。

我使用的工具是DebugDiag。它来自 Microsoft,免费且功能强大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2011-09-22
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    相关资源
    最近更新 更多