为什么我对Activator.CreateInstance的调用间歇性失败?

问题描述:

我使用下面的代码来访问Windows资源管理器外壳的乐队现场服务:为什么我对Activator.CreateInstance的调用间歇性失败?

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; 

大多数情况下,它的伟大工程。的时间(小于1%)一个非常小的比例,调用Activator.CreateInstance抛出以下异常:

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) 

我看过了错误代码,它似乎表明服务ISN没有注册。我非常确定,实际情况并非如此,因为通话在稍后会很好地工作,并且CLSID由explorer.exe提供。

我很难过。什么可能导致Activator.CreateInstance失败,但很少?

+0

纠正我,如果我错了,但不是该对象的存在一个未记录的实现细节? – 2010-05-23 00:14:36

+0

@Stephen:CLSID在SHOBJIDL.H中定义,但在其他方面没有记录。我正在寻找一个实际的答案。如果您对可能导致我观察到的症状的想法有所了解,那么我就会全神贯注。即使这是对explorer.exe可能在内部做什么的猜测。 – 2010-05-23 01:40:11

权限?是的,访问中等完整性应用程序中的COM对象的高完整性应用程序存在问题。在我的网站的某个地方有一个这样的示范。啊,但是对于TrayNotify类,不是TrayBandSiteService。我希望你没有花太多时间去搞清楚你可能很容易就读的东西。

反正看到的this最后一段,从我现在的报价:

顺便说一句,注意,如果用户帐户控制(UAC)已启用,程序与提升程序运行失败特权。 EXPLORER是COM服务器,TRAYNOT(我的演示程序)是一个COM客户端。然而EXPLORER只有中等的完整性。虽然微软关于UAC的笔记 - 它们并不足以作为编程文档 - 它处理的是一个低完整性的COM客户端试图与更高完整性的COM服务器进行通信的情况,对此相反,很少有人说。更高完整性的COM客户端受到低完整性COM服务器的保护,就像更高完整性的程序不能从低完整性程序接收窗口消息一样。对于后者,微软提供了更高完整性的程序,其中明确的意思是将自己打开到来自低完整性源的预期消息。寻找COM的类似规定可能是另一次值得进行的尝试。

我很遗憾地说我从未找到过时间。

我发现了大约TrayBandSiteService这里一些解释: http://www.geoffchappell.com/viewer.htm?doc=studies/windows/shell/explorer/classes/traybandsiteservice.htm

,如果杰夫·查普尔是正确的,也可能是同样的问题,因为我的机器上: 有时探险做了重新启动,并为这一刻(S) TrayBandSiteService可能无法访问。

Activator.CreateInstance(typeof(MyType))当我尝试在独立的Windows应用程序中运行代码时正常工作。如果我尝试在wcf服务下的类库中运行相同的代码,那么它会失败