尝试访问 Lync.DeviceManager.AudioDevices 时引发异常 - 但不是计数 属性
Exception raised attempting to access Lync.DeviceManager.AudioDevices - but not the Count property
正在尝试将活动的 Lync 音频设备设置为可用的音频设备之一。 Lync_Client.DeviceManager.AudioDevices.Count returns 一个大于 0 的数字,但在 for 循环中从 i = 0 到 i < count 或 foreach 的语句如 Lync_CLient.DeviceManager.AudioDevices[i](Lync_Client.DeviceManager.AudioDevices 中的 AudioDevice dev)当 运行 在 Windows 10 PC 上时立即引发异常 - 但在 Windows 7 PC 上不会。 Windows 10 版本产生异常消息:
“调用的目标抛出了异常。
有什么建议吗?这可能是特权问题吗?
下面是 StackTrace:
...at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
...at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
...at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
...at Microsoft.Lync.Model.Internal.UCWCache.CreateUCW(Object source, CCOMInfo ccomInfo)
...at Microsoft.Lync.Model.Internal.UCWCache.GetITTargetNS(Object source)
...at Microsoft.Lync.Model.Internal.UCEnumerator`2.get_Current()
...at ...Microsoft.Lync.Model.Internal.UCEnumerator`2.System.Collections.Generic.IEnumerator<S>.get_Current()
从这里开始的堆栈指向我尝试访问 Lync AudioDevices 元素枚举的代码
问题是 Microsoft 停止发布 Lync Client SDK for Lync 2013 Client。尽管 SDK 仍然适用于最新版本的 Skype for Business 客户端,但由于当前 Skype for Business 客户端与旧版 Lync 客户端 SDK 之间的不兼容,它实际上正在慢慢崩溃。
SDK 的 AudioDevice 区域是 SDK 的已知区域之一,其中客户端 SDK 正在中断。有一个变通方法,您可以下拉到 Lync Client SDK 使用的实际原始 COM 接口,然后使用这些 COM 对象直接访问 API.
您可以通过访问 Lync Client SDK 对象的 "InnerObject" 字段将 Lync Client SDK 转义为原始 COM 对象。
例如:
static bool SetClientAudioDevice(LyncClient client, string name)
{
var innerClient = (ILyncClient)client.InnerObject;
var deviceManager = innerClient.DeviceManager;
Console.WriteLine("Current audio device: [{0}]", client.DeviceManager.ActiveAudioDevice.Name);
Console.WriteLine("Lync Client Audio Devices List:");
var ok = false;
foreach (var device in deviceManager.AudioDevices.OfType<Microsoft.Office.Uc.AudioDevice>())
{
Console.WriteLine(" AudioDevice: [{0}], Active[{1}], ID[{2}], IsCertified[{3}], Priority[{4}], Type[{5}]", device.Name, device.IsActive, device.Id, device.IsCertified, device.Priority, device.Type);
if (device.Name.IndexOf(name, StringComparison.InvariantCultureIgnoreCase) >= 0)
{
Console.WriteLine(" Setting active device!");
deviceManager.ActiveAudioDevice = device;
ok = true;
}
}
return ok;
}
正如评论中所指出的,您还必须添加对 "Microsoft.Office.Uc" 的引用,并将 Embed InteropType 设置为 False。
正在尝试将活动的 Lync 音频设备设置为可用的音频设备之一。 Lync_Client.DeviceManager.AudioDevices.Count returns 一个大于 0 的数字,但在 for 循环中从 i = 0 到 i < count 或 foreach 的语句如 Lync_CLient.DeviceManager.AudioDevices[i](Lync_Client.DeviceManager.AudioDevices 中的 AudioDevice dev)当 运行 在 Windows 10 PC 上时立即引发异常 - 但在 Windows 7 PC 上不会。 Windows 10 版本产生异常消息: “调用的目标抛出了异常。
有什么建议吗?这可能是特权问题吗?
下面是 StackTrace:
...at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
...at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
...at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
...at Microsoft.Lync.Model.Internal.UCWCache.CreateUCW(Object source, CCOMInfo ccomInfo)
...at Microsoft.Lync.Model.Internal.UCWCache.GetITTargetNS(Object source)
...at Microsoft.Lync.Model.Internal.UCEnumerator`2.get_Current()
...at ...Microsoft.Lync.Model.Internal.UCEnumerator`2.System.Collections.Generic.IEnumerator<S>.get_Current()
从这里开始的堆栈指向我尝试访问 Lync AudioDevices 元素枚举的代码
问题是 Microsoft 停止发布 Lync Client SDK for Lync 2013 Client。尽管 SDK 仍然适用于最新版本的 Skype for Business 客户端,但由于当前 Skype for Business 客户端与旧版 Lync 客户端 SDK 之间的不兼容,它实际上正在慢慢崩溃。
SDK 的 AudioDevice 区域是 SDK 的已知区域之一,其中客户端 SDK 正在中断。有一个变通方法,您可以下拉到 Lync Client SDK 使用的实际原始 COM 接口,然后使用这些 COM 对象直接访问 API.
您可以通过访问 Lync Client SDK 对象的 "InnerObject" 字段将 Lync Client SDK 转义为原始 COM 对象。
例如:
static bool SetClientAudioDevice(LyncClient client, string name)
{
var innerClient = (ILyncClient)client.InnerObject;
var deviceManager = innerClient.DeviceManager;
Console.WriteLine("Current audio device: [{0}]", client.DeviceManager.ActiveAudioDevice.Name);
Console.WriteLine("Lync Client Audio Devices List:");
var ok = false;
foreach (var device in deviceManager.AudioDevices.OfType<Microsoft.Office.Uc.AudioDevice>())
{
Console.WriteLine(" AudioDevice: [{0}], Active[{1}], ID[{2}], IsCertified[{3}], Priority[{4}], Type[{5}]", device.Name, device.IsActive, device.Id, device.IsCertified, device.Priority, device.Type);
if (device.Name.IndexOf(name, StringComparison.InvariantCultureIgnoreCase) >= 0)
{
Console.WriteLine(" Setting active device!");
deviceManager.ActiveAudioDevice = device;
ok = true;
}
}
return ok;
}
正如评论中所指出的,您还必须添加对 "Microsoft.Office.Uc" 的引用,并将 Embed InteropType 设置为 False。