C#.NET 2.0应用程序中的ActiveX Flash组件导致内存泄漏?

C#.NET 2.0应用程序中的ActiveX Flash组件导致内存泄漏?,c#,.net,flash,com,activex,C#,.net,Flash,Com,Activex,我们有一个C#/.NET2.0WinForm,上面有一个ActiveX ShockWaveLashObject控件。程序循环浏览内容时间表,并在控件全屏上反复显示,如下所示: axFlash.BringToFront(); axFlash.Movie = scheduleItem.FilePath; axFlash.Show(); axFlash.Play(); System.Runtime.InteropServices.SEHException: External component ha

我们有一个C#/.NET2.0WinForm,上面有一个ActiveX ShockWaveLashObject控件。程序循环浏览内容时间表,并在控件全屏上反复显示,如下所示:

axFlash.BringToFront();
axFlash.Movie = scheduleItem.FilePath;
axFlash.Show();
axFlash.Play();
System.Runtime.InteropServices.SEHException: External component has thrown an exception.
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.AxHost.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
这非常有效,但运行几天后,Flash ActiveX控件所在的窗体将抛出如下异常:

axFlash.BringToFront();
axFlash.Movie = scheduleItem.FilePath;
axFlash.Show();
axFlash.Play();
System.Runtime.InteropServices.SEHException: External component has thrown an exception.
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.AxHost.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
查看taskmanager,我发现我们的程序已经分配了机器上几乎所有的可用内存。(~500MB)

  • ActiveX(COM)组件是否不受垃圾收集的管理
  • Flash9.ocx或Flash10.ocx中是否存在已知内存泄漏
  • 有没有办法让一个外部组件(本例中是Flash ActiveX)在不重新启动程序的情况下释放资源?定期用“新”重新创建ShockWaveLashObject可以解决问题吗
  • 也许定期重新启动程序是唯一的好选择

如果您的C#应用程序中的代码过于简单,我建议您直接在空气中编写。这样,您就不会处理ActiveX和Flash的OCX可能存在的任何错误。

ActiveX组件通常是用非托管代码编写的,因此不会被CLR垃圾收集器清除。您需要确保释放对ActiveX控件的任何引用。我认为这只会造成一个问题,虽然如果你正在重新创建ActiveX控件很多

您可以使用perfmon测量CLR的内存使用情况和总体内存使用情况。你可以用这个来缩小谁在泄漏内存的范围。(区别可能是由于非托管代码造成的,如activex控件)


如果您确实将其与ActiveX或flash控件隔离,则尝试使用不消耗内存的伪对象删除这些对象。这应该可以让您验证它是泄漏源。

只有托管代码被垃圾收集。ActiveX代码使用标准COM样式集合(AddRef/ReleaseRef)。使用com引用完成后,为了安全起见,请将其设置为null,或者在其周围加上一个using()。

这可能有点晚了,但这是我的5美分:

我认为.swf(您正在播放的flash)导致了内存泄漏,我不久前在flash中遇到了这个问题,解决方案是仔细检查代码,正确停止/清除所有计时器,处理所有使用的对象等。我正在用processXP调试,以查看flash如何管理内存,如果您有不好的编码实践(不删除EventListener、不停止计时器、创建新实例并在没有适当处置它们的情况下停止使用它们),那么最终会达到内存限制并崩溃。(无论您在哪里、浏览器中、单机版、活动内部等都会发生崩溃)


如果你是.swf的创建者,你可以更加注意这一点,而不必重新启动程序,但是如果你是从其他来源获得的,你就必须定期关闭它,因为你不知道里面的代码编写得有多好。

问题是程序永远不会使用它。它是一款持续运行的数字看板媒体播放器。也许您的意思是偶尔对其调用.Dispose(),然后使用“new ShockWaveLashObject()”重新创建实例会很有用?嗯。。。有些东西可能很难空运。除此之外,再次更改平台/语言(最初是用Delphi/Win32编写的)可能会增加问题的数量,而不一定会减少问题的数量。谁能说AIR不会像Flash的OCX一样出现问题?我的意思是,它们都是由Macromedia/Adobe造成的。问题是OCX不是Flash本身,它只是围绕Flash组件的ActiveX包装。泄漏很容易发生在垫片中,而不是实际的播放器代码本身。当一部电影被设置时,OCX中可能会发生一个小漏洞,而当前已经设置了一部电影。直接使用空气可以去掉垫片。在空气中做一个硬编码测试很容易,只需反复播放几部电影。让它运行几天,看看内存使用率是否很高。好吧,应用程序本身不应该泄漏,它是垃圾收集的。因此,应用程序中唯一的ActiveX(可能是非托管的)代码Flash组件是唯一的罪魁祸首。这也是有道理的,因为在Delphi/Win32程序中,Flash显然是造成最大问题的原因——实际上,在“结束”前不久,您会看到Flash停止加载。确定测量总是很好的。可能CLR提前保留了一大堆内存,导致闪存程序首先进入内存不足状态。所以我不认为这证明了漏洞在哪里。。。最好测量并确定。@Adam Nofsinger:由.NET应用程序的托管代码导致内存泄漏并不罕见。有许多方面可能会阻止某些对象被垃圾收集,但您可能不清楚这些方面,主要是由其他活动对象持有的引用。尽管问题不像在其他平台上那么频繁,.NET内存泄漏实际上更难检测和修复,因为问题并不总是如此“您忘了发布资源,但一些复杂的相互引用网络阻止对象被垃圾收集。我自己刚去找了一些……嗨,亚当,你找到这个问题的解决办法了吗。我遇到了和一年前一样的问题,那就是我正在将flash嵌入到C#winform应用程序中。此应用程序需要在不重新启动的情况下作为数字看板显示器运行。如果您找到解决此内存泄漏问题的方法,请告诉我。我将非常感谢你的帮助。thx..NNever确实提出了一个不涉及重新启动应用程序的解决方案。对我们来说,我们的解决方案是开发一个小的看门狗应用程序,它可以启动(i