最简单的COM Interop应用程序泄漏内存 - 我做错了什么?

时间:2009-11-26 17:55:23

标签: com-interop

C#

namespace TestController  
{  
    [ComVisible(true)]   
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IController {  
        void DoSomething();
    }  

    [ComVisible(true), ClassInterface(ClassInterfaceType.None)]  
    public class ControllerImpl : IController {  
        public void DoSomething()  
        {  
            throw new NotImplementedException();  
        }  
    }
}

C ++

#import "c:\prj\Controller\bin\Debug\TestController.tlb"  

using namespace TestController;  

int _tmain(int argc, _TCHAR* argv[])
{
    IControllerPtr ctrl;
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    while (true) {
        HRESULT hr = ctrl.CreateInstance(__uuidof(ControllerImpl));
        ctrl = 0;
    }
    return 0;
}

大家好,
我需要从非托管代码提供对我的.NET类库的访问。 Beeing对这个主题完全陌生,我花了几天研究COM / interop,然后定义并实现了一个COM可访问的界面,进行了测试运行,一切正常,直到我注意到一些看起来像是内存泄漏的东西。我隔离了有问题的陈述,但仍然不知道为什么上面的代码被破坏了。

1 个答案:

答案 0 :(得分:0)

这可能是以下情况:

http://jpassing.com/2009/03/26/rcw-reference-counting-rules-com-reference-counting-rules/

具体来说,.NET使用RCW引用计数规则,这些规则与COM应用程序中通常的引用计数规则不同。

这导致明显的泄漏,直到.NET RCW引用计数观察到不再使用给定对象,这需要来自其垃圾收集器的协作。