2011-02-25 107 views
1

我,我做了以下觀察winsvr2008r2 64:RegistrationHelper.InstallAssembly和64位

如果我通過組件服務GUI一切手工創建一個COM +應用程序,並手動安裝所有組件運行64位。

但是,如果我使用代碼(System.EnterpriseServices.RegistrationHelper.InstallAssembly)安裝所有內容,則COM +組件將作爲32位運行。

當使用InstallAssembly時,是否有可能使所有內容都以64位運行?

+0

這沒有意義,InstallAssembly直接寫入註冊表項。請確保您的項目沒有將目標平臺設置爲x86。這是VS2010的默認設置。 – 2011-02-25 15:38:53

+0

不,這沒有意義。但是我對不同的應用程序有同樣的問題。如果我刪除'ServicedComponent'並再次添加(手動),一切正常。所以用RegistrationHelper.InstallAssembly來註冊組件爲32bit。 – jgauffin 2011-03-03 10:15:22

回答

0

當您在內部調用InstallAssembly時,會調用方法ValidateBitness,該方法檢查該程序集是否已安裝錯誤的位數,在這種情況下,它會報告錯誤並以RegistrationException失敗。它根據對IsWow64Process的調用結果確定「正確」的位數。

進一步看來,有一種註冊64位和32位的方法。這似乎是正確的,因爲註冊取決於正在運行的應用程序(稱爲InstallAssembly)的位數。你能確認這確實是以64位運行嗎?

您可能遇到了標記爲「不會很快修復」的報告錯誤。我無法判斷這個bug是否完全適用於您的場景,因爲我不確定設置是否在內部調用相同的API函數。見this post on Microsoft Connect on register keys being stored in the wrong hive

+0

該應用程序使用AnyCPU進行編譯,並在Windows Server 2008 x64作爲操作系統的64位計算機上運行。我將重新編譯爲x64的應用程序,然後重試。 – jgauffin 2011-03-07 18:40:32

1

我不知道這是否是一個錯誤或沒有,但是這可能是涉及到「位數」 COM +組件屬性:Components Collection

如文檔指出,「位數」可以設置爲1( 32位)或2(64位)。您可以使用這種類型的C#代碼給定組件讀取位數值:

COMAdminCatalog catalog = new COMAdminCatalogClass(); 

    ICatalogCollection appCollection = (ICatalogCollection)catalog.GetCollection("Applications"); 
    appCollection.Populate(); 

    // browse all apps 
    foreach (COMAdminCatalogObject app in appCollection) 
    { 
     Console.WriteLine("application=" + app.Name); 
     // browse all components 
     ICatalogCollection compCollection = (ICatalogCollection)appCollection.GetCollection("Components", app.Key); 
     compCollection.Populate(); 
     foreach (COMAdminCatalogObject comp in compCollection) 
     { 
      Console.WriteLine(" component=" + comp.Name); 
      Console.WriteLine(" bitness=" + comp.get_Value("Bitness")); 
     } 

    } 

不幸的是,位數是一個只讀屬性。據我所知,基礎COM註冊過程使用實際進行註冊的過程的位數來確定如何設置此屬性。

這這篇文章中隱含解釋說:Serviced Components in 32-bit and 64-bit Architectures

正如你在表格中看到,64位或32位報名取決於您使用工具的版本。這就是爲什麼像Regsvcs.exe這樣的工具有兩種口味:32位和64位,以及你的組件如何註冊取決於這一點。另外,請注意事實上,如果COM +應用程序是空的,事情可能會有所不同。

我想這意味着您的運行.EXE應該被編譯爲64位。