MyGroups не реализованы в Communicator.UIAutomation - PullRequest
0 голосов
/ 01 декабря 2010

Я работаю над приложением Silverlight без браузера, которое предоставляет некоторые элементы управления MS Office Communicator 2007.Я использую Automation SDK .Документы, которые были установлены с SDK, заявляют, что в интерфейсе IMessenger2 есть свойство MyGroups, которое будет возвращать группы, определенные пользователем, но когда я пытаюсь его использовать, я получаю NotImplementedException.Вот код, который я использую:

dynamic communicator = AutomationFactory.CreateObject("Communicator.UIAutomation");
communicator.AutoSignin();
foreach (dynamic g in communicator.MyGroups)
{
    //Do something with the group
}

Если я заменю MyGroups на MyContacts, я могу получить список контактов просто отлично.Нужно ли делать что-то другое для доступа к свойствам в интерфейсе IMessenger2?В Интернете я видел несколько вещей, в которых говорится, что MyGroups устарела для Windows Messenger, но из документации кажется, что она должна быть доступна для MS Office Communicator.

Если я не могу использовать MyGroups, есть ли другой способ получить группы, которые создал пользователь?

1 Ответ

0 голосов
/ 01 декабря 2010

Проблема здесь в том, что свойство MyGroups помечено как NotScriptable, что означает, что вы не можете вызывать его так, как вы делаете, то есть с помощью AutomationFactory.По соображениям безопасности некоторые свойства и методы в API автоматизации не допускают сценариев - это позволяет избежать вредоносных страниц, автоматизирующих Communicator и выполняющих определенные задачи без вашего ведома.

Похоже, что COM-взаимодействие в Silverlight рассматривается втак же, как, например, создание и вызов API из VBScript, так что вы не сможете получить доступ к любым свойствам и методам, не относящимся к сценариям.См. справочник для получения подробной информации о том, какие свойства и методы не являются сценариями.

Я предполагаю, что это серьезно затруднит работу вашего приложения.Я думаю, что тебе больно, это решение пойти с Silverlight OOB.Есть ли способ использовать WPF (или даже winforms) вместо Silverlight?Если бы вы сделали это, вы могли бы ссылаться на API напрямую и иметь полный доступ ко всем свойствам / методам.

В противном случае, я не могу придумать слишком много вариантов.Вы не можете перехватить событие OnContactAddedToGroup, так как это не поддерживается сценариями.

Это может обернуть API в сборку .NET и предоставить его через COM, затемсоздайте его таким же образом, но в этом случае все еще может соблюдаться Not Scriptable, поэтому он ничего не купит.Трудно сказать, не пытаясь это сделать, и все еще довольно ужасное решение.

Редактировать : Я только что попробовал метод обертки (нужно было сделать что-то подобное в качестве доказательства концепции дляклиент), и это похоже на работу.Вот как я это сделал:

Создайте новую библиотеку классов .NET.Определите интерфейс COM:

[ComVisible(true)]
[Guid("8999F93E-52F6-4E29-BA64-0ADC22A1FB11")]
public interface IComm
{
    string GetMyGroups();
}

Определите класс, который реализует этот интерфейс (вам нужно будет ссылаться на CommunicatorAPI.dll из SDK):

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[GuidAttribute("C5C5A1A8-9BFB-4CE5-B42C-4E6688F6840B")]
[ProgId("Test.Comm.1")]
public class Comm : IComm
{
    public string GetMyGroups()
    {
        var comm = new CommunicatorAPI.MessengerClass();

        var groups = comm.MyGroups as IMessengerGroups;
        return string.Join(", ", groups.OfType<IMessengerGroup>().Select(g => g.Name).ToArray());
    }
}

Сборка и регистрация с использованием Regasm .Затем вызовите приложение OOB silverlight:

dynamic communicator = AutomationFactory.CreateObject("Test.Comm.1");
MessageBox.Show(communicator.GetMyGroups());

Обратите внимание, что та же методика также работает с использованием Lync API:

public string GetMyGroups()
{
    var comm = LyncClient.GetClient();
    return string.Join(", ", comm.ContactManager.Groups.Select(g => g.Name).ToArray());
}

Хотя это работает, я не могу сказать, действительно ли этохорошая практика, так как она работает вокруг ограничения безопасности, которое, по-видимому, существовало по уважительной причине.Я предполагаю, что худшее, что может случиться, это то, что вредоносная веб-страница потенциально может использовать компонент, если она знает ProgId элемента управления.

Редактировать: Кроме того, при использовании этого метода вам нужно быть осторожным с памятьюутечки, например, убедитесь, что вы выпускаете COM-объекты, когда закончите с ними - это достаточно просто сделать, просто нужно немного дисциплинироваться; o)

...