如何在.Net Web应用程序中管理COM对象 P>一个带有一些臭名昭著的内存泄漏问题的传统C++应用程序必须从.NET服务器的Windows应用程序调用。NET垃圾回收时间是不可确定的,有时C++对象被破坏或不被“按时”销毁,产生不可预测的结果,通常崩溃C语言Web应用程序。什么是尽可能频繁地将C++对象推送到垃圾收集堆栈的最好方法,但不是经常移除COM对象的.NET引用。请记住,COM对象可以生成子对象,因此COM对象的.Net引用计数可以仅通过函数调用而不必实例化来更改

如何在.Net Web应用程序中管理COM对象 P>一个带有一些臭名昭著的内存泄漏问题的传统C++应用程序必须从.NET服务器的Windows应用程序调用。NET垃圾回收时间是不可确定的,有时C++对象被破坏或不被“按时”销毁,产生不可预测的结果,通常崩溃C语言Web应用程序。什么是尽可能频繁地将C++对象推送到垃圾收集堆栈的最好方法,但不是经常移除COM对象的.NET引用。请记住,COM对象可以生成子对象,因此COM对象的.Net引用计数可以仅通过函数调用而不必实例化来更改,c++,com,memory-leaks,com-interop,.net-1.1,C++,Com,Memory Leaks,Com Interop,.net 1.1,随着内存泄漏的发生以及COM对象未被清理,性能会下降,直到速度太慢,以至于IIS自身多次跳闸,然后崩溃。重新启动IIS会在下次之前修复此问题。定期重新启动会有所帮助,但忙碌的一天可能会导致工作日出现这种情况 几年前,我不得不使用.NET1.1解决这个问题。不知道是别人有我的解决方案还是更好的。这不是ASP.NET。它是一个.NETDLL P>最终结果并不完全令人满意,Web服务器每隔几个月就会崩溃。 < p>您问“尽可能频繁地将C++对象推到垃圾收集堆上是什么最好的方法”,但是C++对象永远不

随着内存泄漏的发生以及COM对象未被清理,性能会下降,直到速度太慢,以至于IIS自身多次跳闸,然后崩溃。重新启动IIS会在下次之前修复此问题。定期重新启动会有所帮助,但忙碌的一天可能会导致工作日出现这种情况

几年前,我不得不使用.NET1.1解决这个问题。不知道是别人有我的解决方案还是更好的。这不是ASP.NET。它是一个.NETDLL

<> P>最终结果并不完全令人满意,Web服务器每隔几个月就会崩溃。

< p>您问“尽可能频繁地将C++对象推到垃圾收集堆上是什么最好的方法”,但是C++对象永远不会被垃圾收集。也许这样看吧

你有一个实例化一组C++对象的过程。这些C++对象中的一些实现COM对象,因此它们的生存期通过AddiRf/Relp进行管理。其中一些COM对象被导入.NET世界,并用RCW(运行时可调用包装器)进行包装。只有RCW是.NET对象并进入垃圾收集堆

如果没有您的任何干预,RCW最终将被GC’d,当这种情况发生时,它将对其底层COM对象进行发布。如果要立即释放COM对象,而不等待GC,可以调用

System.Runtime.InteropServices.Marshal.ReleaseComObject

。。。如果你确定它是你想要的,甚至是最终的EleaseComObject

回到您的问题:您想知道如何删除C++对象,而不必将.NET引用释放到COM对象。由于C++对象不存在于.NET堆中,所以无法直接实现此目的。您可以从COM对象中公开一个方法,该对象删除所有C++对象,并简单地从.NET代码调用它。但是我想如果你的COM对象能够识别出你已经做过的所有泄漏的C++对象。 希望我已经解释了为什么没有办法实现您在问题中提出的建议,但是有很多工具可以帮助您找到并修复内存泄漏。我建议使用一个工具,比如Redidig(搜索StAdExtit)来找出C++代码泄漏内存的地方。


如果使用IIS6或更高版本,实用的解决方案是配置应用程序池回收。您可以调整这些数字,以便在进程泄漏足够的内存造成问题之前终止并重新启动进程,并且它通常以用户不会注意到任何停机的方式工作。

创建一个COM+应用程序,并将您使用的COM类放在该应用程序中。这样,所有COM对象都在一个单独的进程中实例化。您可以定期释放所有COM对象,只需重新启动COM+应用程序进程。

将COM对象保留在单独的进程中是一个有趣的想法。我不确定这是否可能。COM+就是这样工作的。您使用进程内COM服务器并要求COM+创建一个“COM+应用程序”,它实际上只是一个具有相同功能的进程外COM+服务器。进程外意味着所有对象都在一个单独的进程中。我倾向于同意这在.NET1.1中是困难的或不可能的,但我们有机会转向.NET2.0。这本身是更好的还是有新的功能可以帮助?