Hallo zusammen,
ich habe schon seit Ewigkeiten sporadische Probleme mit einem Outlook-Add-On, dass ich bisher auf .NET 2.0-Grundlage in C# entwickelt habe. Leider lässt sich das nicht gezielt nachstellen, bzw. mir ist bisher nicht bekannt wie ich es nachstellen könnte. Leider werde ich als der Entwickler immer mal wieder auf den Fehler angesprochen und komme hier einfach nicht weiter. Ich habe momentan ein try-catch Drumherum und gebe die Fehlermeldung in einer Message Box aus.
Es gibt eine System.Runtime.InteropServices.COMException "Ein Ereignis konnte keine Abonnenten abrufen" HRESULT 0x80040201
Ich habe nun vor kurzem einen
KB 926997 gefunden, der wohl erst im Januar 2017 erstellt oder aktualisiert wurde und der nach genau dem Problem aussieht. Hier liest es sich aber so, als sei nur .NET 2.0 betroffen und es würde sich mit dem nächsten Windows-Update von alleine lösen, wenn du es schneller brauchst installiere einen Hotfix.
Nun ist mir in dem Zusammenhang aufgefallen, dass das Projekt immer noch auf .NET 2.0 läuft und da der Artikel explizit nur von einem Fehler in .NET 2.0 spricht, habe ich das Projekt auf .NET 4.5.1 umgestellt (ich habe im Moment noch VS 2013 installiert, da ist das das neueste unterstützte) - und auch dort bereits einmal (wieder zu unpassendem Zeitpunkt ohne Debugger) die
Exception bekommen. Mein Problem ist also wohl unabhängig davon, ob ich die Serie .NET 2.0(3.0/3.5 oder 4.0/4.5/4.6 nutze, oder der Artikel ist falsch und es sind auch die neueren Versionen betroffen (für die es nicht einmal einen Hotfix gibt).
Zur Vollständigkeit ein Codingauszug:
Connect.cs (nur um zu zeigen, wo ich her komme - der Fehler kommt in der anderen Klasse, s.u.)
Code:
public class Connect : Object, Extensibility.IDTExtensibility2, Microsoft.Office.Interop.Outlook.FormRegionStartup, Microsoft.Office.Core.IRibbonExtensibility, IDisposable
{
...
public void BeforeFormRegionShow(Microsoft.Office.Interop.Outlook.FormRegion FormRegion)
{
...
new ContactFormInfo(FormRegion);
...
}
ContactFormInfo.cs
Code:
class ContactFormInfo
{
...
private Microsoft.Vbe.Interop.Forms.UserForm Form;
private Microsoft.Vbe.Interop.Forms.Controls Controls;
private Microsoft.Office.Interop.Outlook.OlkCommandButton PruefBtn;
...
public ContactFormInfo(Microsoft.Office.Interop.Outlook.FormRegion FormRegion)
{
// Formularobjekt holen
Form = (Microsoft.Vbe.Interop.Forms.UserForm)FormRegion.Form;
// Auflistung der Unterelemente (Eigenschaft, hinter der eine Funktion/
COM-Aufruf steht, daher aus
// Performancegründen auf Variable gespeichert --> zwei weitere Aufrufe gespart)
#region Anmerkung zu Microsoft.Vbe.Introp.Forms.Userform.Controls und
Exception
// Wenn hier eine
Exception auftritt:
// http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/4f70d238-88b0-485a-806d-d39e6d22fc92/
// Falscher Verweis auf MS Forms 2.0, anderen verwenden.
#endregion
Controls = Form.Controls;
//Objekte zu den Komponenten holen
PruefBtn = (Microsoft.Office.Interop.Outlook.OlkCommandButton)Controls.Item("PruefButton");
...
//Ereignibehandler hinzufügen
try
{
PruefBtn.Click += PruefBtnClick;
}
catch (System.Runtime.InteropServices.COMException e)
{
Connect.ShowException("Fehler beim Registrieren des Eventhandlers für den Prüfbutton", e);
}
}
...
private void PruefBtnClick()
{
...
Die
Exception kommt bei der Anweisung
PruefBtn.Click += PruefBtnClick;. Seht ihr einen Fehler bei mir, meint ihr es ist das von MS beschriebene Problem im .NET Framework selbst oder ganz etwas anderes?
Ich dachte halt, endlich eine Spur zu haben und nun hat es doch nicht geholfen. Zurück zu .NET 2.0 und Hotfix könnte ich noch probieren... aber viel lieber würde ich bei 4.5.1 bleiben und vielleicht demnächst mit einem neuen Visual Studio auf 4.6 gehen. Dann entfällt auch das Aktivieren von .NET 2.0/2.0/3.5 unter Programme und Features, das bisher noch notwendig ist. (4.0 bis 4.6 ist in Windows 10 ja immer aktiv, 2.0 bis 3.5 eben nicht)
Das Problem tritt nur manchmal auf, normalerweise nicht wenn Outlook frisch gestartet wurde sondern nur nach längerer Nutzung, wenn bis dahin der Formularbereich (Zusatzbereich zu einem Outlook-internem Formular) noch nicht genutzt wurde - und selbst dann gibt es meistens keine Probleme. Wenn der Formularbereich schon einmal verwendet wurde, klappen in der Regel auch alle anderen späteren Aufrufe mit neuen Formularbereichen.
Das Ereignis soll beim Anklicken eines Buttons auf dem Formularbereich Vorschlagswerte ermitteln und diese in zwei Eingabefelder auf dem Formularbereich schreiben. Wenn das registrieren des Eventhandlers fehlschlägt, gebe ich eine Meldung aus und dann passiert eben bei Buttonklick nichts und der Anwender muss die Felder selbst ausfüllen. Das ist die einzige Stelle bei der ich Events in dieser Form zu externen Controls registriere, die von Outlook außerhalb meines eigenen .NET Codes erzeugt wurden. Daher funktionieren alle anderen Erweiterungen, die das Addon zu Outlook hinzufügt, weiterhin einwandfrei.
Viele Grüße
Felix