Question

Je travaille sur une application Silverlight de navigateur qui fournit des contrôles MS Office Communicator 2007. J'utilise le automatisation SDK . Les documents qui ont été installés avec l'état du SDK qu'il ya une propriété MesGroupes dans l'interface IMessenger2, qui renverra les groupes qu'un utilisateur a défini, mais lorsque je tente de l'utiliser, je reçois un NotImplementedException. Voici le code que j'utilise:

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

Si je remplace MesGroupes avec MyContacts, je peux obtenir la liste des contacts très bien. Est-ce que je dois faire quelque chose de différent aux propriétés d'accès dans l'interface IMessenger2? Je l'ai vu quelques petites choses sur le web qui disent que MesGroupes a été abandonné pour Windows Messenger, mais à partir de la documentation, il semble que cela devrait être disponible pour MS Office Communicator.

Si je ne peux pas utiliser MesGroupes, est-il une autre façon d'obtenir les groupes qu'un utilisateur a créé?

Était-ce utile?

La solution

Le problème ici est que la propriété MesGroupes est marqué comme notScriptable, ce qui signifie que vous ne pouvez pas l'appeler dans la façon dont vous faites dire en utilisant la AutomationFactory. Pour des raisons de sécurité, certaines propriétés et méthodes de l'API d'automatisation ne sont pas scriptable - est d'éviter les pages malveillantes automatisant Communicator et portant certaines tâches sans vous connaître

.

Il semble que le interop COM dans Silverlight est traité de la même manière que par exemple créer et appeler l'API à partir de VBScript, de sorte que vous ne serez pas en mesure d'accéder à l'une des propriétés non scriptable et méthodes. Voir la référence pour plus de détails sur les propriétés et les méthodes ne sont pas scriptable.

Je suppose que cela va entraver sérieusement votre application. Je pense que ce qui vous blesse est la décision d'aller avec Silverlight OOB. Est-il possible que vous pouvez utiliser WPF (ou même WinForms) plutôt que Silverlight? Si vous avez fait cela, vous pouvez faire référence à l'API directement, et ont un accès complet à toutes les propriétés / méthodes.

Dans le cas contraire, je ne peux pas penser trop d'options. Vous ne pouvez pas piéger l'événement OnContactAddedToGroup, que ce n'est pas scriptable.

peut est possible d'envelopper l'API avec un ensemble .NET, et l'exposer via COM, puis instancier de la même façon - mais non scriptable pourrait encore être respectée dans ce cas, donc il ne vous acheter quoi que ce soit. Difficile à dire sans l'essayer, et encore une solution assez horrible.

Modifier : Je viens de donner la méthode d'emballage un essai (nécessaire pour faire quelque chose de similaire en tant que preuve de concept pour un client), et il semble fonctionner. Ceci est la façon dont je l'ai fait:

Créer une nouvelle bibliothèque de classes .NET. Définir une interface COM:

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

Définir une classe qui implémente cette interface (vous aurez besoin de faire référence à CommunicatorAPI.dll du 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());
    }
}

Générer et enregistrer à l'aide RegAsm . Ensuite, appelez de l'application OOB silverlight:

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

Note, la même technique fonctionne également avec l'API Lync:

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

Bien que cela fonctionne, je ne peux pas vraiment dire que ce soit une bonne pratique, car il travaille autour d'une restriction de sécurité qui était sans doute là pour une bonne raison. Je pense que le pire qui puisse arriver est qu'une page Web malveillant pourrait utiliser le composant, si elle connaissait la ProgId du contrôle.

Edit: En outre, en utilisant cette méthode, vous aurez besoin d'être prudent sur les fuites de mémoire, par exemple assurez-vous libérer des objets COM lorsque vous avez terminé avec eux - assez facile à faire, juste besoin d'un peu de discipline; o)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top