2011-07-28 128 views
9

我有一個第三方COM對象(32位),我需要從我的C#應用​​程序(64位)調用。 我知道我必須在單獨的進程中運行COM對象。 這個COM對象有許多實現的類,所以我試圖避免編寫我自己的公開所有方法的遠程包裝器。 COM +似乎是最直接的解決方案。我打開組件服務菜單,創建一個新的COM +應用程序,將我的COM對象作爲組件添加到此應用程序中。一切都似乎進口美麗。調用32位COM從C#運行在64位模式

以我C#應用程序,我添加原COM對象爲基準(自動生成類型庫)。使用類型庫引用,我可以從COM +組件創建對象(我看到它們開始在組件服務窗口中旋轉),但是當我嘗試訪問對象的方法時,出現錯誤,說明接口未註冊。

有沒有人有線索?我回去並在COM對象上運行了regsvr32,但我認爲這不是必要的,也沒有幫助。 我在C#中的用法是否正確?看到這些方法,VS2008自動完成沒有任何問題。

確切的例外是: 「接口未註冊(從HRESULT異常:0x80040155)」

不清楚究竟有哪些權限和角色有關的組件服務,我嘗試了COM +對象標識設置到在系統帳戶下運行,作爲本地服務和交互式用戶。我已將角色添加爲角色中的用戶。 一切都在本地運行,所以不應該有文件權限或類似的問題。

我也想重申,此COM對象包含很多類。我成功地在客戶端實例化了一個類對象並設置了一些屬性值。 我還成功實例化另一個類的對象,但收到試圖調用這個第二對象的方法時,此異常....所以我不認爲是哪一本登記冊我的COM對象在註冊的問題。

+0

COM +非常依賴於權限等。也許這是怎麼回事...... – Yahia

+4

Windows有效地擁有兩個不同的註冊表,一個用於32位,一個用於64位。我相信這個接口是在一個接口中註冊的,然後在另一個接口中進行註冊。 – GSerg

+0

GSerg是正確的。如果註冊它的應用程序是32位,在64位系統上運行,則所有註冊表項都會在鏡像的WOW6432節點中結束,而不是在通常的情況下運行。 –

回答

2

我們有類似的情況,使用VFP的COM DLL。

這一切都取決於權利和權限,像葉海亞說。 我們得到了它的工作通過這樣做:

  • 安裝VFP OLEDB 9驅動程序(不知道你有什麼,所以可能不需要)。
  • 給網絡服務IIS_IUSR在COM文件夾(必須使DLL可以在自己的文件夾做一些記錄,從網站調用時)的完全控制。
  • 運行regsvr32.exe「c:\ xxx \ yourfile.dll」 - >這應該是成功的!
  • 創建COM +應用程序,並添加DLL的一部分
  • 設置應用程序COM +證書上的用戶爲對象的分析足夠的權限

,我們不得不對應用程序池/ IIS權利做一些更多的設置,但那不是我所要求的。

不管怎麼說,只要確保你有足夠的日誌記錄,確保該dll被註冊,之後,它的所有關於版權權利的權利..

祝你好運吧!

1

對不起,使用「回答」回覆評論,但它似乎是我唯一的途徑。

轉移到64位操作系統的全部目的是爲了獲得額外的可尋址內存空間,因此在32位模式下運行整個應用程序不是一種選擇。

這可能與問題有關,在成功創建三個類對象後,我可以在一個屬性中設置屬性,在第二個參數中調用一個沒有參數的方法,但它在第三個參數中調用一個方法,另外兩個對象作爲拋出異常的參數。