MyGroups не реализованы в Communicator.uiautomation
-
29-09-2019 - |
Вопрос
Я работаю над приложением 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)