GC不收集从互操作程序集实现接口的对象,没有根



经过几分钟的工作后,托管内存包含许多未引用的对象,这些对象的类型是通过从互操作汇编实现接口而创建的。GC。Collect不会从内存中删除对象。

看起来。net为。net对象创建了COM可调用的包装器,并且包装器以某种方式保存了对对象的引用。但是如何对此进行调查呢?

调查:

<>之前[00:016]将堆对象加载到缓存中。共计905554个对象统计:MT Count TotalSize更改类名...0x05127ac0 796 9552 796应用程序。GenericListener...总共905,554个对象,总大小:77354,192之前

类型定义如下:

<>之前//c#代码:公共类GenericListener: OurEventListener, IDisposable{…}//GenericListener没有终结器公共抽象类OurEventListener: EventListener{…}//交互操作组装:[Guid("…")][TypeLibType (256)][InterfaceType (1)]公共接口监听器{…}之前

类型的用法如下:

<>之前var listener = new GenericListener();ourComObject.Subscribe(听众);...ourComObject.Unsubscribe(听众);listener.Dispose ();之前

对象:<>之前[00:016] !dumpheap -mt 0x05127ac0将堆对象加载到缓存中。地址MT大小027a11d4 05127ac0 12 2应用。GenericListener0326d354 05127ac0 12 2应用。GenericListener09c5812c 05127ac0 12 2应用。GenericListener09c83000 05127ac0 12 2应用。GenericListener...之前

对象是根:

<>之前[00:016] !gcroot 027a11d4注意:在堆栈上发现的根可能是误报。运行"!帮助groot"for更多信息。扫描线程0 os线程1444扫描线程2 OSThread b40扫描线程7 os线程1630扫描线程8 OSThread a8扫描线程13 os线程1328域(005年f2e30):处理(RefCnt): 182 d48:根:027 a11d4 (Application.GenericListener)之前

任何想法?

更新:添加如何使用侦听器

这是你在c#中使用的COM对象吗?检查是否按要求调用了FinalReleaseComObject或ReleaseCOMObject,以释放RCW。

最新更新