Domanda

Sto lavorando su un fuori del browser Silverlight app che fornisce alcuni controlli MS Office Communicator 2007. Sto utilizzando il Automation SDK . La documentazione che sono stati installati con lo stato SDK che c'è una proprietà MyGroups nell'interfaccia IMessenger2, che restituirà i gruppi che un utente ha definito, ma quando provo ad usarlo, ottengo un NotImplementedException. Ecco il codice che sto usando:

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

Se sostituisco MyGroups con MyContacts, posso ottenere la lista dei contatti più che bene. Devo fare qualcosa di diverso per accedere alle proprietà nell'interfaccia IMessenger2? Ho visto un paio di cose sul web che dicono che MyGroups stato deprecato per Windows Messenger, ma dalla documentazione, sembra che dovrebbe essere disponibile per MS Office Communicator.

Se non posso usare MyGroups, c'è un altro modo per ottenere i gruppi che un utente ha creato?

È stato utile?

Soluzione

Il problema qui è che la proprietà MyGroups è contrassegnato come NotScriptable, significa che non si può chiamare in modo che si sta facendo vale a dire utilizzando l'AutomationFactory. Per motivi di sicurezza, alcune proprietà e metodi nella API di automazione non sono script - questo è quello di evitare le pagine dannose automatizzando Communicator e che svolgono determinati compiti senza sapere

.

Sembra che l'interoperabilità COM in Silverlight viene trattato nello stesso modo, come ad esempio la creazione e chiamando l'API da VBScript, in modo da non essere in grado di accedere a qualsiasi delle proprietà e metodi non-script. Vedere la riferimento per i dettagli di quali proprietà e metodi non sono script.

Sto cercando di indovinare che questo sta per ostacolare seriamente la vostra applicazione. Penso che quello che fa male è la decisione di andare con Silverlight OOB. C'è un modo si potrebbe usare WPF (o anche WinForms) piuttosto che Silverlight? Se avete fatto questo, si potrebbe fare riferimento l'API direttamente, e hanno pieno accesso a tutte le proprietà / metodi.

In caso contrario, non posso pensare a troppe opzioni. Non è possibile intercettare l'evento OnContactAddedToGroup, in quanto questo non è script.

potrebbe essere possibile avvolgere l'API .NET con un montaggio, ed esporlo via COM, quindi un'istanza allo stesso modo - ma il non Scriptable potrebbe ancora essere rispettata in questo caso, in modo che non si compra nulla. Difficile dire senza provarlo, ed ancora una soluzione piuttosto orribile.

Modifica : Ho appena dato il metodo involucro una prova (necessario per fare qualcosa di simile, come un proof of concept per un cliente), e sembra funzionare. Questo è il modo in cui l'ho fatto:

Creare una nuova libreria di classi .NET. Definire un'interfaccia COM:

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

Definire una classe che implementa l'interfaccia (è necessario fare riferimento CommunicatorAPI.dll dal 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());
    }
}

Genera e registrarsi utilizzando RegAsm . Quindi chiamare dalla app OOB silverlight:

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

Nota, la stessa tecnica funziona anche utilizzando l'API di Lync:

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

Anche se questo funziona, non posso davvero dire se si tratta di una buona pratica, come si sta lavorando intorno a una restrizione di sicurezza che era presumibilmente lì per una buona ragione. Credo che la cosa peggiore che potrebbe accadere è che una pagina web malintenzionato potrebbe potenzialmente utilizzare il componente, se sapesse il ProgId del controllo.

Edit: Inoltre, con questo metodo si avrebbe bisogno di essere attenti a perdite di memoria, per esempio assicurarsi che si sta rilasciando gli oggetti COM quando hai finito con loro - abbastanza facile da fare, solo bisogno di un po 'di disciplina; o)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top