我刚刚开始使用CSCore,在经历了很多C++之后,我又回到了C#。下面是一个测试程序,它枚举默认音频会话管理器的音频会话,并在每个音频会话管理器上附加一个空事件处理程序:
using System;
using CSCore.CoreAudioAPI;
class Program
{
static void Main(string[] args)
{
using (var enumerator = new MMDeviceEnumerator())
using (var device = enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia))
using (var sessionManager = AudioSessionManager2.FromMMDevice(device))
using (var sessionEnumerator = sessionManager.GetSessionEnumerator())
{
foreach (var control in sessionEnumerator)
{
var control2 = control.QueryInterface<AudioSessionControl2>();
RegisterAudioSession(control2);
}
}
Console.WriteLine("Waiting...");
Console.ReadKey();
}
static void RegisterAudioSession(AudioSessionControl2 session)
{
if (session.Process != null)
{
var events = new AudioSessionEvents();
session.RegisterAudioSessionNotification(events);
}
}
}我希望能够改变我的计算机的体积,而这个程序运行时,没有任何问题。但是,如果尝试这样做,程序会在本机代码中与访问冲突崩溃。下面是堆栈跟踪:
> AudioSes.dll!CLockedList<ATL::CComPtr<IAudioSessionEvents>,0,1>::ForEachEntry() Unknown
AudioSes.dll!CAudioSessionControl::OnAudioSessionEvent() Unknown
AudioSes.dll!CAudioSessionControl::CAudioSessionNotificationDelegator::OnMediaNotification(struct MEDIA_NOTIFICATION_BLOCK *) Unknown
MMDevAPI.dll!CMediaNotifications::OnMediaNotificationWorkerHandler(struct _TP_CALLBACK_INSTANCE *) Unknown
MMDevAPI.dll!CMediaNotifications::MediaNotificationWorkerHandler(struct _TP_CALLBACK_INSTANCE *,void *) Unknown
ntdll.dll!TppSimplepExecuteCallback() Unknown
ntdll.dll!TppWorkerThread() Unknown
kernel32.dll!@BaseThreadInitThunk@12() Unknown
ntdll.dll!__RtlUserThreadStart() Unknown
ntdll.dll!__RtlUserThreadStart@8() Unknown如果删除对RegisterAudioSessionNotification的调用,则不会发生崩溃。
如果注册非空事件处理程序,则仍会发生崩溃。
我尝试将Console.ReadKey();移动到using块中,以防止必要的资源被释放,但是失败仍然存在。
我到处寻找解释和解决办法。在CSCore的github页面上没有相关的未决问题。我在某个地方读到,本机代码中的崩溃通常是由包装程序集中的错误签名引起的。我比较了CSCore的IAudioSessionEvents上的所有方法和本机IAudioSessionEvents方法(枚举这里,但没有发现明显的差异。
这个火狐错误是我在网上找到的关于这个特定堆栈跟踪的唯一引用,并且它已经解决了。显然,它是在Flash 19.0.0.159中解决的,但据我所知,这个源是不可阅读的。
我是忽略了代码中的错误,还是CSCore中的错误?
发布于 2016-06-04 03:07:03
如果目标平台是32位(或者在我的例子中是“任意CPU”,但运行在32位VS进程中),则会发生此崩溃。切换到64位目标平台帮我修好了
https://stackoverflow.com/questions/37555207
复制相似问题