Frage

Ich arbeite an einem aus Browser Silverlight-Anwendung, die einige MS Office Communicator 2007 Kontrollen zur Verfügung stellt. Ich bin mit dem Automation SDK . Die Dokumente, die mit dem SDK Zustand installiert wurden, dass es eine MyGroups Eigenschaft in der IMessenger2-Schnittstelle, die die Gruppen zurück, dass ein Benutzer definiert hat, aber wenn ich versuche, es zu benutzen, habe ich eine NotImplementedException bekommen. Hier ist der Code, dass ich mit:

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

Wenn ich MyGroups mit MyContacts ersetzen, kann ich die Kontaktliste erhalten gut. Muß ich etwas andere Zugriffseigenschaften in der IMessenger2 Schnittstelle zu tun? Ich habe ein paar Sachen auf dem Netz gesehen, die sagen, dass MyGroups für Windows Messenger veraltet wurde, sondern von dem docs, scheint es, wie es für MS Office Communicator verfügbar sein sollte.

Wenn ich nicht MyGroups verwenden kann, gibt es eine weitere Möglichkeit, um die Gruppen zu erhalten, die ein Benutzer erstellt hat?

War es hilfreich?

Lösung

Das Problem hierbei ist, dass die MyGroups Eigenschaft als NotScriptable markiert ist, das heißt, Sie es in der Art und Weise nicht aufrufen können Sie das heißt mit der AutomationFactory tun. Aus Sicherheitsgründen sind einige Eigenschaften und Methoden in der Automatisierungs-API nicht skriptfähig - diese bösartige Seiten automatisieren Communicator zu vermeiden ist und die Durchführung bestimmter Aufgaben, ohne dass Sie wissen,

.

Es sieht aus wie die COM-Interop in Silverlight in der gleichen Weise behandelt wird, wie z.B. Erstellen und die API von VBScript aufrufen, so dass Sie nicht in der Lage sein werden, eine der nicht-skriptfähige Eigenschaften und Methoden zuzugreifen. Sehen Sie sich die Referenz für Details, welche Eigenschaften und Methoden sind nicht skriptfähig.

Ich vermute, das wird ernsthaft Ihre App humpeln. Ich denke, was weh Sie die Entscheidung mit Silverlight OOB zu gehen. Gibt es eine Möglichkeit Sie WPF (oder sogar WinForms) verwenden könnte, statt Silverlight? Wenn Sie dies getan, können Sie die API direkt verweisen und haben vollen Zugriff auf alle Eigenschaften / Methoden.

Ansonsten kann ich glaube, nicht zu viele Optionen. Sie können nicht fangen die OnContactAddedToGroup Ereignis, da dies nicht skriptfähig.

Es Macht möglich sein, die API mit einem .NET-Assembly zu wickeln, und setzen Sie es über COM, dann instanziiert es auf die gleiche Art und Weise - aber die nicht skript noch in diesem Fall eingehalten werden könnte, so wird es nicht Sie etwas kaufen. Schwer zu sagen, ohne sie, und immer noch eine ziemlich schreckliche Lösung zu versuchen.

Bearbeiten : Ich habe gerade die Wrapper-Methode einen Versuch gegeben (benötigt etwas ähnliches wie ein Proof of Concept für einen Kunden zu tun), und es scheint zu funktionieren. Dies ist die Art, wie ich es tat:

Erstellen Sie eine neue .NET-Klassenbibliothek. Definieren Sie eine COM-Schnittstelle:

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

Definieren Sie eine Klasse, die Geräte, die eine Schnittstelle (Sie müssen CommunicatorAPI.dll aus dem SDK verweisen):

[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());
    }
}

Erstellen und registrieren mit RegAsm . Dann rufen Sie aus der OOB Silverlight-Anwendung:

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

Beachten Sie die gleiche Technik funktioniert auch den Lync-API:

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

Obwohl dies funktioniert, kann ich nicht wirklich sagen, ob es eine gute Praxis, da es eine Sicherheitseinschränkung funktioniert rund um die für einen guten Grund, vermutlich da war. Ich denke, das Schlimmste, was passieren könnte, ist, dass eine böswillige Webseite möglicherweise die Komponente verwenden könnte, wenn es die ProgId der Steuer kennt.

Edit: Auch mit dieser Methode werden Sie brauchen, um über Speicherlecks, vorsichtig zu sein, z.B. sicherzustellen, dass Sie die Freigabe für COM-Objekte, wenn Sie mit ihnen fertig sind - einfach genug zu tun, braucht nur ein wenig Disziplin; o)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top