2013-01-02 78 views
1

簡短的2個問題,在閱讀幾個主題/頁面後我找不到明確的答案。如何處理32位和64位環境之間的Interops?

  1. 如果我複製了一些互操作的dll到我的電腦,它的建立到AnyCpu(使用.NET反射檢查),如果我要引用到它的應用程序構建64位(現在我得到一個例外) - 註冊爲64位就夠了(有regasm) - 或者我們不註冊interops - 只有COM的?

  2. 如果我有互操作DLL - 我可以得到原來的COM爲其創建了互操作(這對於創建另一個互操作,例如對於64位環境很有用)?

編輯:@大衛響應後,我檢查了多一個選擇,意想不到的是工作,但現在我不知道是什麼意思了討論和解決方案。任何人都可以幫助解決這個問題嗎?

我做什麼: 我跟着從here說明,現在從COM對象不與我的64位應用程序的工作!對所有對象手動執行此操作可能會非常棘手(其中有數百個對象) - 處理Interop的正確方法是什麼?

問候, jotbek

+1

當您在.NET中創建一個要從COM應用程序使用的庫時,會使用'regasm',而不是在.NET中要使用COM庫時使用'regasm'。 – prprcupofcoffee

+0

@大衛:謝謝我不知道。 – jotbek

+1

雖然使用[DllSurrogate](http://msdn.microsoft.com/en-us/library/windows/desktop/ms691260(v = vs.85).aspx)確實解決了Bitness問題,但它的預期用途似乎隔離 - 保持COM DLL中的任何問題不影響主程序。 – prprcupofcoffee

回答

2

COM服務器(DLL)中的本機代碼,所以它們不能越過邊界位數,即,32位到64位。你的.NET代碼需要被編譯爲x86(至少在啓動代碼中),以便擁有一個32位進程來加載COM DLL(除非COM DLL本身是64位,在這種情況下你的啓動代碼需要編譯爲x64)。

互操作DLL只是一個.NET程序集,其中包含用於調用COM對象方法的粘連。知道interop DLL的用途是什麼COM DLL不會讓你生成一個不同位數的工作互操作DLL。

+0

所以你說這個標誌與.Net反射器檢查我的Interop DLL是爲AnyCPU構建的是不相關的?這意味着每個in​​terop需要固定爲32位/ 64位體系結構 - 因爲它是Interop連接的原始COM位的結果? – jotbek

+1

@jotb​​ek - Interop DLLs應該是AnyCPU。需要匹配的是COM DLL的位數以及啓動代碼所在的組件。AnyCPU程序集將以進程開始的任何位運行(這就是爲什麼它是「AnyCPU」:)的原因。您當然可以構建一個32位特定的interop DLL,但這只是額外的工作。 – prprcupofcoffee

+0

好的,非常感謝,如果我必須在64位運行主進程,並且我有AnyCPU Interop,它是適用於原始COM(即32位)的適配器,那麼我的選項是什麼?我也檢查了這一點,並且我知道代理過程會起作用,但不幸的是,它有點慢,但RCW - 運行時可調用包裝程序怎麼樣 - 但爲此,我需要原始COM DLL,並且從您編寫它不會工作那麼當我的原始COM是x32時,我將無法爲64位構建RCW? – jotbek