Winforms 关闭带有AxWindowsMediaPlayer的窗体时发生AccessViolation异常

Winforms 关闭带有AxWindowsMediaPlayer的窗体时发生AccessViolation异常,winforms,.net-3.5,activex,windows-media-player,wmp,Winforms,.net 3.5,Activex,Windows Media Player,Wmp,我在表单上有一个AxWMPLib.AxWindowsMediaPlayer。当我关闭表单时,我得到“试图读取或写入受保护的内存。这通常表示其他内存已损坏。”异常。可以隐藏表单,但不能关闭表单。当组件从表单中移除时,一切都正常 这是Winforms.Net3.5 感谢您的帮助。关闭父窗体时,ActiveX对象可能会对以正确顺序关闭有一些敏感依赖关系,否则它们可能会一直存在,直到gc运行为止-请尝试在界面中查找控件,查找与关闭相关的任何方法,或者销毁对象并调用它们。有时在.NET应用程序中使用Act

我在表单上有一个
AxWMPLib.AxWindowsMediaPlayer
。当我关闭表单时,我得到“试图读取或写入受保护的内存。这通常表示其他内存已损坏。”异常。可以隐藏表单,但不能关闭表单。当组件从表单中移除时,一切都正常

这是Winforms.Net3.5


感谢您的帮助。

关闭父窗体时,ActiveX对象可能会对以正确顺序关闭有一些敏感依赖关系,否则它们可能会一直存在,直到gc运行为止-请尝试在界面中查找控件,查找与关闭相关的任何方法,或者销毁对象并调用它们。

有时在.NET应用程序中使用ActiveX对象时,必须在退出时强制执行垃圾收集。我通常在表格_结束时使用以下方法:

GC.WaitForPendingFinalizers()
GC.Collect()
此外,如果您已经为对象设置了任何事件处理程序,则需要显式断开它们的连接。我发现在很多情况下,ActiveX对象仍将在垃圾箱中保持活动状态,并将尝试调用事件处理程序,即使它们已被释放


在您尝试处理对象之前,确保播放已停止也是值得的。

这发生在我身上,是在按键期间关闭窗体时发生的

如果WMP控件有一个关键事件要处理,它似乎会导致问题

Form.KeyPreview=True的示例

Sub Form_KeyDown(e As KeyEventArgs)
 AxWindowsMediaPlayer1.Dispose()
End Sub
导致访问冲突

Sub Form_KeyDown(e As KeyEventArgs)
 e.Handled = True
 AxWindowsMediaPlayer1.Dispose()
End Sub
当按键被阻止到达WMP控件时,会干净地关闭

关闭窗体时会发生与处理控件时相同的情况。

我想我有它:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    axWindowsMediaPlayer1.close();
}
只是在文档上找到了方法
我想我应该试一试。现在似乎好多了。

我尝试过停止、重置源URL、关闭、处理,但没有成功。通过找出错误的来源,我们能更接近问题吗?我还没有检查事件日志。我发现确实在执行一个
axWindowsMediaPlayer1.Dispose();GC.WaitForPendingFinalizers();GC.Collect()
\u FormClosing()
事件中,确实有帮助。不,它没有。。。还是违反,不,毕竟也不好。我们可以做任何我们想做的事情,这个控制被窃听了,故事结束了。如果我有时间的话,我会放弃这种微软的恐惧,使用VLC库。