Wie kann ich vermeiden, RPC_E_CALL_REJECTED Ausnahmen bei der Durchführung von PowerPoint-automation?
Wenn mein code versucht, erstellen Sie eine neue Instanz von Microsoft.Office.Interop.PowerPoint.Application
, bekomme ich manchmal folgende exception:
System.Runtime.InteropServices.COMException (0x80010001): Retrieving the COM class factory for component with CLSID {91493441-5A91-11CF-8700-00AA0060263B} failed due to the following error: 80010001 Call was rejected by callee. (Exception from HRESULT: 0x80010001 (RPC_E_CALL_REJECTED)).
at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(RuntimeType objectType)
at System.Runtime.Remoting.Activation.ActivationServices.CreateInstance(RuntimeType serverType)
at System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK(RuntimeType serverType, Object[] props, Boolean bNewObj)
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
Ich sage manchmal, weil es nicht geschehen, konsequent auch den gleichen Eingang. Darüber hinaus tritt es auch (mit dem gleichen Mangel an Konsistenz) in andere Teile von meinem code, wo ich auch die Interaktion mit der PowerPoint-automation-API.
Habe ich ausprobiert, diese Lösung für MSDN-selbst das scheint die am meisten empfohlene Lösung gibt. Jedoch, es scheint nicht zu Auswirkungen haben, als ich noch beobachten das gleiche Verhalten.
Meine Fragen sind:
- Hat die MSDN-Lösung funktioniert für PowerPoint-automation?
- Wie kann ich überprüfen, ob ich richtig angewendet es an meinem code?
- Hat jemand eine alternative Lösung?
Ich bin mit C#, .NET 4 und PowerPoint 2007.
- Ich bin mit den gleichen Problemen. Hinzufügen vielleicht einen Thread.Sleep(100) hier und da helfen sollte? Füllen eines Diagramms die Aktualisierung einige Zeit dauert die grapics etc, so müssen Sie möglicherweise warten, bevor Sie mehr Daten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich in dieser vor-und Paul B ist in der Tat richtig. Es hängt davon ab, ob Sie anrufen, die Powerpoint-OM aus dem Haupt-thread (also
This_AddIn
) oder nicht. Wenn Sie sind, ppt, sollten Sie nicht werfen diese Ausnahmen. Allerdings, wenn Sie anrufen, ppt aus einem anderen thread, die Sie implementieren müssenIMessageFilter
mit diesen windows-Nachrichtensystem Fehler effizient, da ppt priorisiert Haupt-thread-Aufrufe, um die OM über Aufrufe von anderen threads, daher der Aufruf Ablehnungen.Es ist eine andere Einschränkung, die erfordert, dass weitere boiler plate code für die zusätzliche
COMException
s wie0x800AC472 (VBA_E_IGNORE)
. Es ist ein Beispiel hier.So, die Lösung ist sowohl zu implementieren
IMessageFilter
zu nutzen und so etwas wie sepp2k ist - code, in dem auf wickeln Sie Ihre OM aufrufen, um mit anderen Arten vonCOMException
, die ausgelöst werden können.So, für Verpackung code wie sein:
die Sie anrufen könnte, mit lamdas wie diese:
Der Grund für diese zwei-Säulen-Ansatz ist, dass die
IMessageFilter
Strategie ist effizienter als das werfen von Ausnahmen und werden öfter als nicht in der Lage sein zu handhaben, die gebucht-Nachrichten aus der app. Aber zu anderen Zeiten müssen Sie die Ausnahmen behandeln, so dass Sie haben, beides zu tun...Sehen Sie sich hier die Implementierung IMessageFilter, die beinhaltet Wrapper
Hth!
Ich habe es nicht ausprobiert, aber Andrew Whitechapel beschreibt den gleichen Ansatz für Büro, damit ich denke, es sollte funktionieren: http://blogs.msdn.com/b/andreww/archive/2008/11/19/implementing-imessagefilter-in-an-office-add-in.aspx
Give it a try 🙂
Weitere Möglichkeit wäre die Umsetzung eine Art des Wartens Mechanismus, durch den Fang des Fehlers und erneuter Versuch (auch genannt hier).