2012-03-04 50 views
0

我正在寫一個從x64過程(SS Reporting Services)調用並需要使用x86第三方COM程序集的C#程序集。x86 COM互操作從x64 .Net程序集使用COM + - 「沒有這樣的接口支持」錯誤

當我將我的程序集編譯爲x64時,只要第一次調用COM程序集,就會得到「類未註冊」COM異常。

以下建議here(對不起,如果我的術語不正確)我創建了一個新的COM +應用程序,並添加了我引用的COM程序集中找到的組件。當我運行我的總成64它使對COM組件一些成功的呼叫,直到我得到這個錯誤:

Unable to cast COM object of type 'TRIMSDK.RecordTypesClass' to interface type 'TRIMSDK.IBaseObjects'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{8A354545-6BCB-11D3-B273-00A0C9FC3DC0}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

「TRIMSDK.RecordTypesClass」根據類定義並實現「TRIMSDK.IBaseObjects」。

如果我從錯誤消息或'IBaseObjects'中搜索註冊表中的接口GUID,則找不到匹配項。自從創建COM +應用程序後,我在x86模式下得到了相同的錯誤(我猜這是有道理的),儘管在x86之前它在x86中運行良好。

所以,我假設'TRIMSDK.IBaseObjects'接口我正在嘗試使用不被註冊爲COM + thingy,我不知道爲什麼或如何解決它。

任何想法?提前致謝。

更新:我覺得我得到了E_NOINTERFACE例外TRIMSDK.IBaseObjects因爲該接口上的TypeLibType屬性設置爲僅「FNonExtensible」,而其他接口我成功地使用在組裝也有「FDispatchable」。是否有可能解決這個錯誤(改變類型庫或手動註冊'IBaseObjects'接口)?

+0

http://msdn.microsoft.com/en-us/library/aa384231(v=vs.85).aspx – 2012-03-04 12:43:56

+0

謝謝你的鏈接,但是我沒有在這裏找到任何特別有用的東西。我應該尋找什麼? – AndrewS 2012-03-04 14:53:17

+0

如果您無法關注該文章,您可以嘗試通過http://1code.codeplex.com/wikipage?title=COM索取樣本。很可能您的COM對象註冊不正確。 – 2012-03-05 05:13:11

回答

0

這是一個相當古老的問題,但我剛剛在我們的環境中對此問題進行了一段時間的努力後纔對此進行了整理。我對COM和/或Interop幾乎沒有經驗,所以如果我的術語有點不對,那麼請原諒我。

我得到的錯誤信息是;

Unable to cast COM object of type 'TYSTransfer.TransferClass' to interface type 'TYSTransfer._Transfer'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{E825C39B-1EF3-4319-89FC-AEF62C8117B9}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

我也在努力尋找消息中指定的接口GUID。我查看了組件服務中分配給我們COM組件的GUID,可以看到;

GUID that component services showed

然後,當我用DotPeek看,我用訪問此COM組件產生的互操作類,我注意到,在同一界面相關的GUID是一個如報道中我的錯誤;

DotPeek data of the same interface

所以DotPeek向我表明的GUID被引用的是從我的互操作類。原來,針對目標COM對象重新生成Interop類生成了一個具有正確Guid的類(至少它們匹配,所以我認爲它們是正確的),並利用這一點解決了我們的問題。

+0

所以你重新建立了項目,它解決了你的問題?你的回答做得很好,表明你有同樣的問題,但解決方案不是很清楚。 – Trisped 2012-11-06 08:21:50

+0

這更多的是編譯時間的運行時問題。我們在運行時使用的生成的Interop類被替換爲重新生成的類。一旦該程序重新啓動,並生成新的Interop類,它就再次開始工作。這就是我的意思是「利用這個問題解決了我們的問題」。這個問題突然出現的原因是由於將代碼移到新的服務器上。我認爲這一舉措有些混亂。 – 2012-11-06 08:27:50