2008-12-11 68 views
22

我有一個x64服務器,自從我的庫被編譯爲AnyCPU後,它將在x64下運行。我們需要訪問在x86下注冊的COM組件。我對COM的瞭解不夠,我的谷歌搜索引導我無處可去。從x64 .NET訪問x86 COM1

問題:對於COM組件,我可以使用從x64到x86的符號註冊表鏈接嗎?我是否還需要在x64下注冊COM組件?我可以(在這裏的任何聲明...)?

謝謝。

回答

26

如果某個組件正在運行x64-native,則它無法加載32位COM服務器,因爲它是錯誤的進程類型。有幾個可能的解決方案:

  1. 如果可以的話,建立COM代碼的64位版本(這當然會在64位註冊表中註冊本身)。這是最乾淨的解決方案,但如果您沒有COM服務器的代碼,則可能無法實現。

  2. 將.NET組件運行爲32位x86而不是x64。我假設你出於某種原因已經考慮並拒絕了這一個。

  3. 使用COM surrogate DLLhost.exe託管COM組件的進程外。這會使調用COM服務器的速度慢得多(它們現在是進程間Windows消息而不是本地函數調用),但是透明(您不必做任何特別的事情)。

    如果服務器需要一個自定義的代理存根,而不是使用正常的oleaut32,那麼這可能不是一個選項(儘管非常少見),因爲不會有64位版本的代理可用。只要它可以使用普通的OLE編組,你可以只需register it for surrogate activation

+0

#1是不可能的,因爲沒有x64版本。 #2失敗了在x64上運行的目的。 #3工作得很好。直到我們獲得新版本的圖書館,我們才能在這裏接受表演。謝謝你的幫助。 – 2008-12-11 14:29:56

2

這是你的COM組件被裝在一個COM服務器(即一個獨立的過程),那麼你不需要做任何特殊的COM子系統將遙控你的電話從你的x64應用的X86應用程序和再次回來。

如果您的組件是一個進程內COM組件,那麼您將不得不重新考慮一下,因爲64位進程無法在進程COM組件中使用32位。您可以強制您的服務器在x86下運行,以便您可以訪問這些組件(它們都將是32位進程)。如果你不想這樣做,那麼你將不得不看看你使用的COM組件的x64位版本。

6

我發現這個解決方案,Dealing with Legacy 32-bit Components in 64-bit Windows參見文章:
•從過程到外的過程
•使用COM +作爲主機(這項工作對我來說)
•使用轉換項目類型dllhost作爲代理主機

+7

鏡像鏈接:http://www.scribd.com/doc/56629579/64-Bit-Insider-Volume-1-Issue-7 – Juhl 2011-11-03 13:58:37