使用NAudio的MMDevice.Properties.SetValue时遭遇E_ACCESSDENIED权限问题
NAudio更新音频设备属性遇未授权异常的解决方案
一、先排查权限问题(优先,毕竟C++代码能正常运行)
- 检查程序运行权限:C++代码大概率是以管理员权限启动的,而你的.NET程序没提权。右键点击程序选择「以管理员身份运行」试试,看异常是否消失。
- 检查设备权限设置:部分音频设备属性修改需要当前用户拥有「完全控制」权限。打开设备管理器→找到对应音频设备→右键属性→切换到安全选项卡,给当前用户添加完全控制权限。
二、NAudio的PropVariant实现缺陷排查
NAudio的PropVariant类确实存在部分VT_TYPE(比如VT_BSTR)未完整实现的情况,但你用的是VT_BLOB,先核对代码里的Blob构造是否正确:
- 你代码里
blob.Length = state.Length * 2 + 2逻辑是对的,Unicode字符占2字节,还要加上终止符的2字节;也可以写成(state.Length + 1) * 2,结果一致。 - NAudio的
SetValue是直接调用Core Audio的IPropertyStore::SetValue接口,接口定义是完整的,但PropVariant的托管到原生封送可能出问题,比如VT_BLOB的blobVal转换是否正确。
三、绕过NAudio封装,直接调用原生API
如果NAudio的PropVariant确实存在问题,可以跳过它的封装,手动用P/Invoke调用原生接口:
- 定义
IPropertyStore的P/Invoke接口:
[ComImport] [Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IPropertyStore { uint GetCount(); void GetAt(uint index, out PropertyKey key); void GetValue(ref PropertyKey key, out PropVariant pv); void SetValue(ref PropertyKey key, ref PropVariant pv); void Commit(); }
- 从
MMDevice获取原生的IPropertyStore实例:
// 不同NAudio版本获取方式可能不同,也可尝试转换endpoint.NativeInterface var propertyStore = (IPropertyStore)endpoint.AudioClient;
- 手动构造正确的
PropVariant并调用:
string state = "..."; PropertyKey PKEY_My_PropertyKey = new PropertyKey(Guid.Parse("{XXXXXX-XXXX-XXXX-XXXX-xxxxxxxxxxxx}"), 6); using (var blobData = new BlobData(state)) { PropVariant pv = new PropVariant { vt = (short)VarEnum.VT_BLOB, blobVal = blobData.Blob }; propertyStore.SetValue(ref PKEY_My_PropertyKey, ref pv); propertyStore.Commit(); } // 辅助类自动管理Blob内存,避免泄漏 public class BlobData : IDisposable { public Blob Blob { get; } private IntPtr _dataPtr; public BlobData(string text) { _dataPtr = Marshal.StringToHGlobalUni(text); Blob = new Blob { Length = (uint)((text.Length + 1) * 2), Data = _dataPtr }; } public void Dispose() { if (_dataPtr != IntPtr.Zero) { Marshal.FreeHGlobal(_dataPtr); _dataPtr = IntPtr.Zero; } } }
四、更新NAudio到最新版本
旧版NAudio的PropVariant和SetValue存在已知bug,更新到最新稳定版,很多兼容性问题会被修复。
内容的提问来源于stack exchange,提问作者Random
相关产品推荐
相关产品推荐

