2011-08-05 166 views
0

我創建一個使用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

+0

我不確定它會起作用,因爲32位msi安裝程序是作爲32位進程啓動的。這應該導致AnyCPU DLL以32位運行(AnyCPU DLL在32位進程內運行)。因此需要有一個64位和32位MSI安裝程序。 –

+0

我想讓32位msi安裝程序啓動一個執行AnyCPU控制檯應用程序(exe)的_new_進程,但前提是我們在64位操作系統上。理論上這個新的過程應該以64位的方式運行(並且可以訪問64位的machine.config)。 – codyzu

+0

MSI嚴重依賴比特率。也許他們會在某一天改進,可能在沒有人再安裝32位操作系統的時候。只需要運行兩次安裝是一個非常低的痛苦解決方案。無論如何。 –

回答

1

回答我的問題:

1)我不需要32位和64位的安裝程序。但是,這僅僅是因爲我的所有程序集都是AnyCPU。

2)這不是一個壞主意,相反,它是一個好主意,因爲我只需要一個安裝程序分發到客戶端,並奇蹟般地瓶坯額外安裝64位的機器操作。

3)我認爲如果程序集或包含的引用是爲32位或64位顯式構建的,M $表示擁有兩個安裝程序。

最終的溶液:以我的32位的安裝程序,我註冊在machine.config組裝。然後我檢查操作系統是否是64位(使用提供我的問題的鏈接)。如果是這樣,我啓動一個命令行實用程序(包含在我的安裝程序中),它是爲AnyCPU構建的獨立進程。該實用程序將我的程序集註冊到64位machine.config中。這是有效的,因爲AnyCPU實用程序只在64位操作系統上作爲新進程啓動,假設它將默認爲64位進程。完成。