尝试访问 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。