Pregunta

Estoy trabajando en un navegador de Silverlight aplicación que proporciona algunos controles MS Office Communicator 2007. Estoy usando el automatización SDK . Los documentos que se instalaron con el estado SDK que hay una propiedad MyGroups en la interfaz IMessenger2, que devolverá los grupos que un usuario ha definido, pero cuando trato de usarlo, me siento un NotImplementedException. Aquí está el código que estoy usando:

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

Si sustituyo MyGroups con MyContacts, que puede obtener la lista de contactos muy bien. ¿Tengo que hacer algo diferente a las propiedades de acceso en la interfaz IMessenger2? He visto algunas cosas en la web que dicen que MyGroups desfasado y para Windows Messenger, pero a partir de la documentación, que parece que debería estar disponible para MS Office Communicator.

Si no puedo usar MyGroups, ¿hay otra manera de obtener los grupos que un usuario ha creado?

¿Fue útil?

Solución

El problema aquí es que la propiedad MyGroups se marca como NotScriptable, lo que significa que no se puede llamar en la forma en que está haciendo es decir, utilizando el AutomationFactory. Por razones de seguridad, algunas propiedades y métodos en la API de automatización no se pueden ejecutar scripts - esto es para evitar la automatización de páginas maliciosas Communicator y que realizan determinadas tareas sin conocimiento del usuario

.

Parece que la interoperabilidad COM en Silverlight es tratada de la misma manera que, por ejemplo, crear y llamar a la API desde VBScript, por lo que no será capaz de acceder a cualquiera de las propiedades y métodos no secuencias de comandos. Vea la referencia para los detalles de qué propiedades y métodos no son secuencias de comandos.

supongo que esto va a entorpecer gravemente su aplicación. Creo que lo que está haciendo daño es la decisión de ir con Silverlight fuera de banda. ¿Hay alguna forma de poder utilizar WPF (o incluso winforms) en lugar de Silverlight? Si lo ha hecho, se podría hacer referencia a la API directamente, y tener acceso completo a todas las propiedades / métodos.

De lo contrario, no puedo pensar en demasiadas opciones. No se puede interceptar el evento OnContactAddedToGroup, ya que esto no es de secuencias de comandos.

podría sea posible envolver la API .NET con un montaje, y exponerla a través de COM, a continuación, crear una instancia de la misma manera - pero el no scripts todavía podría ser respetada en ese caso, por lo que no se va a comprar nada. Es difícil de decir, sin tratar, y siendo una solución bastante horrible.

Editar : Yo sólo he dado el método de envoltura en un intento (necesario para hacer algo similar a una prueba de concepto para un cliente), y parece que funciona. Esta es la forma en que lo hice:

Crear una nueva biblioteca de clases de .NET. Definir una interfaz COM:

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

Definir una clase que implementa la interfaz (que necesitará para hacer referencia CommunicatorAPI.dll desde el 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());
    }
}

Generar, y registrar el uso de RegAsm . A continuación, llamar desde la aplicación Silverlight fuera de banda:

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

Tenga en cuenta, la misma técnica también funciona con la API de Lync:

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

A pesar de esto funciona, realmente no puedo decir si es una buena práctica, ya que está trabajando en torno a una restricción de seguridad que era de suponer que hay una buena razón. Creo que lo peor que podría suceder es que una página web malintencionado podría utilizar el componente, si se conocía la ProgId del control.

Edit: Además, el uso de este método que había necesidad de tener cuidado con las pérdidas de memoria, por ejemplo asegúrese de que está liberando objetos COM cuando haya terminado con ellos - bastante fácil de hacer, sólo necesita un poco de disciplina; o)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top