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

时间:2010-05-22 23:26:52

标签: c# winforms com winapi createinstance

我正在使用以下代码访问Windows资源管理器Shell的乐队网站服务:

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)

我查找了错误代码,似乎表明该服务未注册。我很确定实际情况并非如此,因为调用会在一段时间后正常工作,而CLSID由explorer.exe提供。

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

3 个答案:

答案 0 :(得分:1)

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

无论如何,请参阅this的最后一段,我现在引用它:

  

除此之外,请注意,如果启用了用户帐户控制(UAC)并且程序以提升的权限运行,则程序将失败。 EXPLORER是COM服务器,TRAYNOT(我的演示程序)是COM客户端。然而,EXPLORER只具有中等完整性。虽然微软关于UAC的说明 - 它们并不足以算作编程文档 - 处理低完整性COM客户端试图与更高完整性的COM服务器通信的情况,但奇怪的是反过来说。保护较高完整性的COM客户端免受较低完整性COM服务器的影响,就像保护较高完整性程序免受从较低完整性程序接收窗口消息一样。对于后者,Microsoft为更高完整性的程序提供明确的方法,以便从较低完整性的源中打开自己的预期消息。找到COM的类似规定可能是另一次有价值的练习。

我很遗憾地说我从来没有找到时间。

答案 1 :(得分:0)

我在这里找到了一些关于TrayBandSiteService的解释: http://www.geoffchappell.com/viewer.htm?doc=studies/windows/shell/explorer/classes/traybandsiteservice.htm

如果Geoff Chappell是对的,它可能与我的机器上的问题相同: 有时,资源管理器会重新启动,此时可能无法访问TrayBandSiteService。

答案 2 :(得分:0)

Activator.CreateInstance(typeof(MyType))当我尝试在独立的Windows应用程序中运行代码时工作正常。当我尝试在wcf服务

下的类库中运行相同的代码时失败的地方