2009-05-17 111 views
13

我需要將一些傳統的32位代碼(我沒有源代碼)集成到項目中,以便可以從64位.NET程序集中調用它。原始代碼是作爲DLL中的32位COM對象實現的。 Windows不允許從64位到32位的對象進行直接調用,所以我正在尋找如何處理這種情況的靈感。64位到32位Interop - 如何?

如何從64位.NET程序集訪問傳統的32位COM對象?

更新:我們發現COM組件本身就是一些ANSI C的包裝,我們可以爲其創建源代碼。我們可以在Visual Studio中將它編譯爲本地64位dll,並將其導入到.NET中 - 對不起,移動了門柱!

+0

評論,因爲我沒有這樣做,但你需要確保你運行COM對象作爲進程外服務器。如果您將它加載爲進程內,它將以64位運行,這將失敗。 – 2009-05-17 18:09:42

回答

8

最好的方法是製作一個包含32位DLL的進程外COM服務器。然後你可以從64位代碼中調用它。

Here is an explanation的基本概念。

+0

由於我們發現了一些導致我們採用不同解決方案的源代碼,因此我移動了一些門柱。我接受這個答案,因爲我覺得它最好地回答了原來的問題,並鏈接到有用的閱讀材料。 – 2009-05-20 14:31:02

3

你需要做的是創建兩個與IPC通信的進程。這樣,一個可以是32位,一個可以是64位。您需要創建一個與COM對象鏈接的32程序,並通過某種IPC機制(如命名管道)公開其API。這樣你的.NET程序就可以從另一個進程訪問它。

+0

這種方法是有效的,但如果你已經使用COM,爲什麼切換到命名管道而不是使用COM互操作? – 2009-05-17 18:13:48

+0

@Reed Copsey:噢,是的,當然你可以用它來做COM。但我的方法更一般;它也可以用於普通的圖書館。 – Zifre 2009-05-17 18:45:04

3

看看這個blog post。您可以使用運行時可調用包裝函數從64位.NET應用程序中引用32位COM程序集。簡短的版本是以下...

  1. 使用tlbimp.exe是創建一個64位運行時可調用包裝:

    tlbimp.exe foo.dll /machine:x64 /out:Interop.Foo.dll

  2. ,如果你註冊COM組件(不是RCW)尚未:

    regsvr32.exe foo.dll

  3. 參考了RCW(例如Interop.Foo.dll )從您的應用程序。將您的構建配置更改爲x64,讓我們搖滾吧。