2009-01-15 64 views
2

我有一個訪問32位COM組件的32位管理程序集。當我使用64位標誌編譯程序集時,當我嘗試從中訪問32位COM組件時出現錯誤。.NET中的互操作問題

有沒有辦法解決這個問題?

+0

問題是該進程加載x64 .NET框架。 32位的COM組件正在被加載到相同的進程(這是64位),這是不可能的。您應該強制它運行32位x86 .NET框架。 – 2009-01-15 23:34:37

回答

0

您可以嘗試使用corflags(可能/可能不起作用),或者將您的應用程序設置爲僅在32位中編譯。

corflags <assemblyname> /32bit- 

刪除了對.Net程序集的32位限制。

+0

這會如何解決問題?這不應該是/ 32bit +嗎? – 2009-01-15 23:44:06

1

您應該找到並安裝此com組件的64位版本。如果它不可用,則必須將.net應用程序作爲32位應用程序運行。 com組件正在運行。而且你不能在同一個進程中同時運行32位和64位代碼。

2

當您使用64位標誌並在64位操作系統上運行時,程序集將加載到64位進程中。絕大多數COM對象都是以「在Proc服務器」中創建的。

創建「in proc server」的第一步是將包含COM對象的DLL加載到創建過程中。 DLL是32位,不能加載到進程中。

你不幸堅持2個選項

  1. 明確編譯EXE的.Net爲32位
  2. 寫的組件,以便它可以在它自己的進程主持。即使那樣我也不確定讓32位和64位進程彼此交談是多麼容易。
2

除了已經給出的答案:

在Windows x64時的處理可以開始爲32位或64位的過程。 64位進程只能加載64位dll,而32位進程只能加載32位dll。

如果您的.Net應用程序的平臺目標(例如在項目屬性中指定)設置爲「任何CPU」,則中間代碼將根據目標平臺編譯爲32位或64位代碼,即x64系統將生成64位代碼。

因此,該代碼無法再在64位系統上加載32位dll。

如果您的代碼加載非託管程序集,則應始終明確指定目標平臺。

0

當進程加載爲x64時,無法加載x86二進制文件/程序集/任何內容。