Вопрос

Я работаю над приложением Browser Silverlight, которое обеспечивает контроль управления MS Office Communicator 2007. Я использую Автоматизация SDK.. Отказ Документы, которые были установлены с состоянием SDK, что есть свойство MyGroups в интерфейсе Imessengener2, что вернет группы, которые определили пользователь, но когда я пытаюсь использовать его, я получаю 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, есть ли другой способ получить группы, которые создал пользователь?

Это было полезно?

Решение

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

Похоже, что Com Interops в Silverlight относится так же, как и, например, создание и вызов API от VBScript, поэтому вы не сможете получить доступ к любым неграммам и методам и методам. Увидеть Справка Для получения подробной информации о том, какие свойства и методы не связаны с сценарием.

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

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

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

Редактировать: Я только что дал метод обертки. Это так, как я сделал это:

Создайте новую библиотеку классов .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());
}

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top