[Visual Studio] 在64位元作業系統中無法正常執行32位元WCF Service之解決方法

如果使用Visual Studio 2008/2010針對32位元的WCF Service Library進行Debug時,Visual Studio會很貼心的自動幫我們以Microsoft WCF Service Host來承載該Library,以讓Debug的動作能順利進行。這個動作在一般32位元的作業系統上執行通常是很正常,也很順利就能Work;不過,若是改用64位元的作業系統,要執行Debug的動作時,就不一定會這麼順利了....

 

如果使用Visual Studio 2008/2010針對32位元的WCF Service Library進行Debug時,Visual Studio會很貼心的自動幫我們以Microsoft WCF Service Host來承載該Library,以讓Debug的動作能順利進行。這個動作在一般32位元的作業系統上執行通常是很正常,也很順利就能Work;不過,若是改用64位元的作業系統,要執行Debug的動作時,就不一定會這麼順利了,你可能會看到Microsoft WCF Service Host跳出如下的視窗:

image

 

從視窗裡面提供的訊息判斷,有可能是configuration file(組態檔)的內容有問題,導致它在透過Reflection要去讀取Assembly的時候找不到他要的檔案。但是,真的是這樣嗎!?相同的組態檔,在32位元的作業系統裡跑,就跑得很開心啊~在64位元的作業系統裡面跑,不行就是不行~

其實這個問題是因為Microsoft WCF Service Host會自動依照作業系統是64位元或是32位元,去讀取不同的Library導致,而因為我們的作業系統是64位元的,它很自然的就想去找64位元的Library來讀取,也很自然的就會找不到,所以產生錯誤。

那麼,產生這種問題,但是又非得使用x86版本的Library不可的時候,怎麼辦呢?其實方法很簡單,只要透過VS2008/2010裡面的一個小工具,改變Microsoft WCF Service Host運行方式的旗標就行了,方法如下:

按下開始功能表->所有程式->找到裡面的Visual Studio程式集資料夾(如果使用的版本是VS 2010就是Microsoft Visual Studio 2010),並找到裡面的Visual Studio Tools->Visual Studio Command Prompt (2010)

image image image

接著會跳出一個熟悉的DOS視窗,如下圖:

image

 

再來我們要切換到放置Microsoft WCF Service Host的執行檔WcfSvcHost.exe的路徑下(預設的路徑為C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\)

image

 

最後,我們要使用VS內建的工具Corflags.exe來修改WcfSvcHost.exe執行期的旗標,強制讓它也能相容32位元的應用程式,在命令列上面輸入:Corflags WcfSvcHost.exe /32BIT+ /Force,按下Enter。

image

 

沒有意外的話,本來在64位元作業系統裡面不能跑的WCF Service就又會變回一條活龍啦!!

image

 

如果有需要更進一步的了解Corflags是幹嘛用的,則可以參考MSDN