我創建一個使用AnyCPU建立了一個ADO.NET數據提供程序。當直接引用時,它可以在64位和32位Windows操作系統上正常工作。但是,在我的安裝程序中,我使用.NET machine.config註冊了我的DbProviderFactory,並將我的程序集放入GAC,以便用戶可以通過System.Windows.DbProviderFactories訪問數據提供程序。只要應用程序以32位的方式運行,此功能就很有用。它不適用於爲x64構建的應用程序。啓動64位進程修改32位和64位.NET machine.config中
這就是我發現的。我的安裝程序針對32位。因此,我的DbProviderFactory僅被添加到32位.NET machine.config。爲了讓x64應用程序通過DbProviderFactory使用我的數據提供程序,它需要使用64位.NET machine.config進行註冊。
我必須有兩個安裝程序?一個定位32,另一個定位64?我所有的程序集都是AnyCPU(因爲我不知道或關心用戶的應用程序是什麼平臺)。
我有點複雜的解決方案是這樣的。在安裝程序期間,我有自定義操作來檢查操作系統是否是64位(here)。如果是這樣,我想啓動一個運行64位控制檯應用程序的進程,該應用程序會將我的DbProviderFactory添加到machine.config(64位)。而我的安裝程序本身也會在32位的machine.config中註冊。我試過了,但是失敗了,因爲在32位目標設置項目中無法使用64位程序集。但是,我將嘗試使用AnyCPU構建控制檯應用程序,假定它將在64位操作系統上作爲64位進程運行。
這是相當混亂的,但我認爲它會工作。爲什麼這是一個壞主意?微軟爲什麼要說:「要將.NET Framework應用程序分發到32位和64位平臺,需要構建兩個MSI包,一個是32位的,另一個是64位的計算機」(msdn)。它會工作,因爲技術上我所有的組件都是AnyCPU?
而且,我使用.NET 3.5
我不確定它會起作用,因爲32位msi安裝程序是作爲32位進程啓動的。這應該導致AnyCPU DLL以32位運行(AnyCPU DLL在32位進程內運行)。因此需要有一個64位和32位MSI安裝程序。 –
我想讓32位msi安裝程序啓動一個執行AnyCPU控制檯應用程序(exe)的_new_進程,但前提是我們在64位操作系統上。理論上這個新的過程應該以64位的方式運行(並且可以訪問64位的machine.config)。 – codyzu
MSI嚴重依賴比特率。也許他們會在某一天改進,可能在沒有人再安裝32位操作系統的時候。只需要運行兩次安裝是一個非常低的痛苦解決方案。無論如何。 –