2010-05-22 54 views
5

我使用下面的代碼來訪問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

回答

1

權限?是的,訪問中等完整性應用程序中的COM對象的高完整性應用程序存在問題。在我的網站的某個地方有一個這樣的示範。啊,但是對於TrayNotify類,不是TrayBandSiteService。我希望你沒有花太多時間去搞清楚你可能很容易就讀的東西。

反正看到的this最後一段,從我現在的報價:

順便說一句,注意,如果用戶帳戶控制(UAC)已啓用,程序與提升程序運行失敗特權。 EXPLORER是COM服務器,TRAYNOT(我的演示程序)是一個COM客戶端。然而EXPLORER只有中等的完整性。雖然微軟關於UAC的筆記 - 它們並不足以作爲編程文檔 - 它處理的是一個低完整性的COM客戶端試圖與更高完整性的COM服務器進行通信的情況,對此相反,很少有人說。更高完整性的COM客戶端受到低完整性COM服務器的保護,就像更高完整性的程序不能從低完整性程序接收窗口消息一樣。對於後者,微軟提供了更高完整性的程序,其中明確的意思是將自己打開到來自低完整性源的預期消息。尋找COM的類似規定可能是另一次值得進行的嘗試。

我很遺憾地說我從未找到過時間。

0

Activator.CreateInstance(typeof(MyType))當我嘗試在獨立的Windows應用程序中運行代碼時正常工作。如果我嘗試在wcf服務下的類庫中運行相同的代碼,那麼它會失敗