5 Stimmen

Warum schlägt mein Aufruf von Activator.CreateInstance gelegentlich fehl?

Ich verwende den folgenden Code, um auf den Band-Site-Dienst der Windows Explorer Shell zuzugreifen:

Guid GUID_TrayBandSiteService = new Guid(0xF60AD0A0, 0xE5E1, 0x45cb, 0xB5, 0x1A, 0xE1, 0x5B, 0x9F, 0x8B, 0x29, 0x34);
Type shellTrayBandSiteService = Type.GetTypeFromCLSID(GUID_TrayBandSiteService, true);
site = Activator.CreateInstance(shellTrayBandSiteService) as IBandSite;

Meistens funktioniert es gut. In einem sehr geringen Prozentsatz der Zeit (weniger als 1 %) löst der Aufruf von Activator.CreateInstance die folgende Ausnahme aus:

System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {F60AD0A0-E5E1-45CB-B51A-E15B9F8B2934} failed due to the following error: 80040154.
  at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
  at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
  at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
  at System.Activator.CreateInstance(Type type, Boolean nonPublic)

Ich habe den Fehlercode nachgeschlagen, und er scheint darauf hinzuweisen, dass der Dienst nicht registriert ist. Ich bin mir ziemlich sicher, dass das nicht der Fall ist, da der Aufruf ein paar Augenblicke später problemlos funktioniert und die CLSID von explorer.exe .

Ich bin verblüfft. Was könnte dazu führen, dass Activator.CreateInstance fehlschlägt, aber nur selten?

0 Stimmen

Korrigieren Sie mich, wenn ich falsch liege, aber ist das Vorhandensein dieses Objekts nicht ein undokumentiertes Implementierungsdetail?

0 Stimmen

@Stephen: Die CLSID ist in SHOBJIDL.H definiert, aber ansonsten undokumentiert. Ich bin auf der Suche nach einer praktischen Antwort. Wenn Sie eine Idee haben, was die Symptome, die ich beobachte, verursachen könnte, bin ich ganz Ohr. Selbst wenn es nur Spekulationen darüber sind, was explorer.exe intern tun könnte.

1voto

Geoff Chappell Punkte 26

Berechtigungen? Ja, es gibt ein Problem, wenn Anwendungen mit hoher Integrität auf COM-Objekte in Anwendungen mit mittlerer Integrität zugreifen. Irgendwo auf meiner Website gibt es eine Demonstration von genau diesem Problem. Ah, aber für die TrayNotify Klasse, nicht TrayBandSiteService . Ich hoffe, Sie haben nicht zu viel Zeit damit verbracht, etwas herauszufinden, das Sie einfach nur gelesen haben könnten.

Wie auch immer, siehe den letzten Absatz von este , aus dem ich jetzt zitiere:

Nebenbei bemerkt: Das Programm schlägt fehl, wenn die Benutzerkontensteuerung (UAC) aktiviert ist und das Programm mit erhöhten Rechten ausgeführt wird. EXPLORER ist der COM-Server und TRAYNOT (mein Demonstrationsprogramm) ist ein COM-Client. Dennoch hat EXPLORER nur eine mittlere Integrität. Obwohl Microsofts Hinweise zu UAC - sie sind nicht wirklich umfangreich genug, um als Programmierdokumentation zu gelten - sich mit der Situation eines COM-Clients mit niedrigerer Integrität befassen, der versucht, mit einem COM-Server mit höherer Integrität zu kommunizieren, wird seltsamerweise wenig über den umgekehrten Fall gesagt. Ein COM-Client mit höherer Integrität ist vor einem COM-Server mit niedrigerer Integrität geschützt, so wie ein Programm mit höherer Integrität vor dem Empfang von Fensternachrichten von einem Programm mit niedrigerer Integrität geschützt ist. Für letzteres stellt Microsoft dem Programm mit höherer Integrität explizite Mittel zur Verfügung, um sich für erwartete Nachrichten von einer Quelle mit niedrigerer Integrität zu öffnen. Die Suche nach einer analogen Bestimmung für COM könnte eine lohnende Aufgabe für ein anderes Mal sein.

Ich bedaure, dass ich nie die Zeit dafür gefunden habe.

0voto

ralf.w. Punkte 1573

Ich habe hier einige Erläuterungen zu TrayBandSiteService gefunden: http://www.geoffchappell.com/viewer.htm?doc=studies/Windows/shell/explorer/classes/traybandsiteservice.htm

und wenn Geoff Chappell recht hat, könnte es sich um das gleiche Problem handeln wie bei meinem Rechner: Manchmal startet der Explorer neu, und in diesem Moment ist der TrayBandSiteService möglicherweise nicht zugänglich.

0voto

yamini Punkte 31

Activator.CreateInstance(typeof(MyType)) Es funktioniert gut, wenn ich versuche, den Code in einer eigenständigen Windows-Anwendung auszuführen. Wenn ich versuche, denselben Code in einer Klassenbibliothek unter wcf-Diensten auszuführen, schlägt er fehl.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X