C# Vista上的SoundPlayer崩溃

C# Vista上的SoundPlayer崩溃,c#,winforms,windows-vista,audio,C#,Winforms,Windows Vista,Audio,以下代码导致Vista计算机上出现间歇性崩溃 using (SoundPlayer myPlayer = new SoundPlayer(Properties.Resources.BEEPPURE)) myPlayer.Play(); 我高度怀疑是这段代码,因为程序在嘟嘟声中或每次播放嘟嘟声之前崩溃。对于我的应用程序域中的所有线程异常,未处理异常,我都有顶级陷阱,并且在应用程序周围有一个try catch。运行,没有一个陷阱会捕获此崩溃 有什么想法吗 编辑: 事件查看器具有以下信息

以下代码导致Vista计算机上出现间歇性崩溃

using (SoundPlayer myPlayer = new SoundPlayer(Properties.Resources.BEEPPURE))
     myPlayer.Play();
我高度怀疑是这段代码,因为程序在嘟嘟声中或每次播放嘟嘟声之前崩溃。对于我的应用程序域中的所有
线程异常
未处理异常
,我都有顶级陷阱,并且在
应用程序周围有一个
try catch
。运行
,没有一个陷阱会捕获此崩溃

有什么想法吗


编辑:

事件查看器具有以下信息:

正在出错的应用程序[xyz].exe,版本4.0.0.0,时间戳 0x48ce5a74,故障模块msvcrt.dll,版本7.0.6001.18000,时间 戳记0x4791a727,异常代码0xc0000005,故障偏移量0x00009b30, 进程id 0x%9,应用程序启动时间0x%10

有趣的是,
HRESULT 0xc000005
包含以下消息:

“正在读取或写入无法访问的内存位置。” (状态\访问\违反)


您可以使用WinDBG并捕获所有第一次机会异常。我相信你会看到一些有趣的东西。如果是这样,您可以使用SOS清理堆栈,并将其发布在此处以帮助我们

也可以通过启用所有异常的陷阱来使用VisualStudio。转到“调试”和“异常”,确保捕获所有内容。同时将调试器切换到混合模式(托管和非托管)

一旦得到堆栈跟踪,我们就可以确定答案


进程不会在Windows上无例外地退出。在里面。此外,您可能需要检查计算机的事件日志,以查看是否显示了任何内容。

事件查看器显示HRESULT 0xc0000005“读取或写入不可访问的内存位置”(状态\u访问\u冲突)


更多详细信息,请参见上面的“我的编辑”;重新编程需要一段时间,因此我暂时无法获得WinDBG的新崩溃转储。

解决方案是使用Microsoft.VisualBasic.Devices,它不会出现此错误。由于它只是Vista,而事件查看器甚至在记录崩溃的过程中失败了(进程id 0x**%9**应该在那里有一个十六进制值),我将责任归咎于Vista中的新声音代码


顺便说一句,将VS调试器连接到远程管理的崩溃进程,首先挂起Visual Studio,然后在我的计算机上造成BSOD,同时杀死无响应的devenv.exe。太好了

这里纯粹是猜测,但问题可能是using语句。您的代码如下(我认为):

using块会在myPlayer上调用Dispose(),有时是在播放完声音之前(但很少,因为声音很短-声音较长,我敢打赌每次都可以重现错误)。错误可能是Windows API(SoundPlayer包装)试图播放已由.NET处理的缓冲区的结果

我认为如果你这样做:

SoundPlayer myPlayer = new SoundPlayer(BEEPPURE);
myPlayer.Play();
甚至

(new SoundPlayer(BEEPPURE)).Play();
您将不再看到错误。

实际上,上面的代码(即新的SoundPlayer(BEEPPURE)).Play();这对我来说太糟糕了

本文解释了原因,并提供了SoundPlayer的另一种完美替代方案:


了解实际的碰撞信息会很有帮助。请提供一个包含托管和非托管框架的堆栈跟踪(将调试器切换到托管和非托管模式)。调试器中不会发生此崩溃(在客户计算机上的字段中可以观察到),正如我提到的,不会触发任何异常陷阱。进程将退出。Nick,由于prolem似乎是Vista的声音API,请在connect.Microsoft.com上将此问题通知Microsoft。我想不会。即使使用了using块,我也无法再现错误。
(new SoundPlayer(BEEPPURE)).Play();