Erstellung Button in CommandBar nur bei Mail

Aug 27, 2013 at 5:38 AM
Edited Aug 27, 2013 at 5:38 AM
Hallo,
ich versuche seit einiger Zeit einen Button in die Standard-CommandBars zu integrieren, aber nur, wenn ein neues Mailfenster bzw. eine vorhandene Mail geöffnet wird, also nicht beim Öffnen einer Notiz oder eines Kallendereintrages.

Hier mal mein bisheriger Stand der Dinge:

Als erstes klinke ich mich in das Event ein, wenn ein neues Fenster geöffnet wird:
void IDTExtensibility2.OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) {
   _outlookApplication = new Application(null, application);
   _outlookInspectors = _outlookApplication.Inspectors as Inspectors;
   
   if (_outlookInspectors != null) {
     _outlookInspectors.NewInspectorEvent += OutlookInspectorsNewInspectorEvent;
   }
}
Wenn dann ein Fenster geöffnet wird, schaue ich nach, ob es ein Mailitem ist. Wenn ja, dann füge einen Button zur standardBar hinzu
void OutlookInspectorsNewInspectorEvent(_Inspector inspector) {
  try {
    var citem = inspector.CurrentItem;
    if (citem is MailItem) {
      _standardBar = inspector.CommandBars["Standard"];

      _mBttn = (CommandBarButton)_standardBar.Controls.Add(MsoControlType.msoControlButton, 1, null, 3, true);
      _mBttn.Style = MsoButtonStyle.msoButtonIconAndCaption;
      _mBttn.FaceId = 225;  // Schloss (Icon)

      _mBttn.Caption = "Test";
      _mBttn.Tag = "MBUTTON";
      _mBttn.ClickEvent += MCmdBarBttnClickEvent;
    }
  }
}
Und zum Schluß noch der Button Event:
void MCmdBarBttnClickEvent(CommandBarButton ctrl, ref bool cancelDefault) {
  ...
  ctrl.Dispose();
}
Allerdings habe ich hier das Problem, dass sich mein ProxyCount immer weiter erhöht und ich nicht weiss,
ob bei einem Count von mehreren Hundert bis Tausend nach einem Arbeitstag, dies negative Auswirkungen auf die Performance haben könnte.

Wie sieht hier ein sauberes Vorgehen aus, um die Proxys so gering wie möglich zu halten ohne z.B. das Event für den dynamisch erstellten Button
in der Standardbar zu verlieren? Was ja z.B passieren würde, wenn ich am Ende von OutlookInspectorsNewInspectorEvent ein _standardBar.Dispose(); ausführen würde.

Oder gibt es eine ganz andere Vorgehensweise, wie ich einen Button in die StandardBar bekomme, eventuell mit "ein- und ausblenden"?

Danke und viele Grüße, Daniel
Coordinator
Aug 27, 2013 at 7:24 AM
Edited Aug 27, 2013 at 7:50 AM
Nach meiner Erfahrung ist alles <1000 Proxies okay (meine Faustregel) Allerdings hängt es auch davon ab was für ein Objekt hinter Proxy steht. Zur Erinnerung: Der Proxy ist nur ein Stellvertreter in der eigenen Anwendung für eine Instanz in der Office Anwendung. Je nachdem wieviel Speicher dieses tatsächliche Objekt belegt, steigt dadurch der Speicherverbrauch der Office Anwendung und irgendwann wird diese dann behäbig.

Zu deiner Frage:
NetOffice bietet für solche Fälle eine Überladung der Dispose und DisposeChildInstance Methoden an:
void Dispose(bool disposeEventBinding);

Du kannst also am Ende des Inspector Events inspector.Dispose(false); aufrufen um möglichst effizizient vorzugehen.


*Sebastian