我正在开发一个浏览器Silverlight应用程序,该应用程序提供了一些MS Office Communicator 2007控件。我正在使用 自动化SDK. 。使用SDK状态安装的文档,即Imessenger2接口中有一个MyGroups属性,该属性将返回用户定义的组,但是当我尝试使用它时,我会得到一个 NotImplementedException. 。这是我正在使用的代码:

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

如果我用MyContacts替换MyGroup,则可以获得完美的联系列表。我必须做一些不同的事情以访问iMessenger2接口中的属性吗?我在网络上看到了一些东西,说MyGroup已弃用Windows Messenger,但是从文档中,似乎应该适用于MS Office Communicator。

如果我不能使用myGroup,是否有另一种方法可以获取用户创建的组?

有帮助吗?

解决方案

这里的问题在于,MyGroups属性被标记为“不可记录”,这意味着您无法以使用AutomationFactory进行IE来调用它。出于安全原因,自动化API中的某些属性和方法是不可脚本的 - 这是为了避免使沟通器自动化的恶意页面并在不知道的情况下执行某些任务。

看起来Silverlight中的COM Interop的处理方式与EG创建和调用VBScript的API的处理方式相同,因此您将无法访问任何不可脚本的属性和方法。看到 参考 有关哪些属性和方法不可脚本的详细信息。

我猜这将严重困扰您的应用程序。我认为伤害您是与Silverlight Oob一起决定的决定。您有什么办法可以使用WPF(甚至Winforms)而不是Silverlight?如果这样做,则可以直接引用API,并可以完全访问所有属性/方法。

否则,我想不出太多的选择。你不能陷入困境 OnContactAddedToGroup 事件,因为这是不可脚本的。

可能 有可能用.NET组件包装API,并通过COM将其曝光,然后以相同的方式实例化 - 但是在这种情况下仍然可以尊重不可脚本的脚本,因此它不会购买任何东西。不用尝试就很难说,仍然是一个相当可怕的解决方案。

编辑: :我刚刚尝试了包装器方法(需要做类似的事情,例如为客户提供类似的概念证明),而且似乎有效。这就是我这样做的方式:

创建一个新的.NET类库。定义com界面:

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

定义一个实现该接口的类(您需要从SDK引用Communicationapi.dll):

[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