Возникла исключительная ситуация при попытке доступа к Lync.DeviceManager.AudioDevices - но не к свойству Count - PullRequest
0 голосов
/ 27 октября 2018

Попытка установить активное аудиоустройство Lync на одно из доступных аудиоустройств.Lync_Client.DeviceManager.AudioDevices.Count возвращает число больше 0, но такие операторы, как Lync_CLient.DeviceManager.AudioDevices [i] в ​​цикле for от i = 0 до i

Есть предложения? Может ли это быть проблемой привилегий?

Ниже приведено описание 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

1 Ответ

0 голосов
/ 29 октября 2018

Проблема в том, что Microsoft прекратила выпуск Lync Client SDK для Lync 2013 Client.Хотя SDK по-прежнему работает с последней версией Skype для бизнеса Client, он на самом деле медленно разрушается из-за несовместимости между текущим клиентом Skype для бизнеса и более ранним Lync Client SDK.

Область AudioDeviceSDK - это одна из известных областей SDK, где ломается Client SDK.Существует обходной путь, при котором вы можете перейти к фактическим необработанным COM-интерфейсам, которые использует Lync Client SDK, а затем использовать эти COM-объекты для прямого доступа к API.

Вы можете экранировать Lync Client SDK внеобработанные COM-объекты путем доступа к полю «InnerObject» объекта Lync Client SDK.

например:

    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 ", а также установите для типа внедрения InteropType значение False.

...