Проблема здесь в том, что свойство 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)