[.NET Framework]使用.net remoting讓x64/x32互動

[.NET Framework]使用.net remoting讓x64/x32互動

先前的兩篇文章主要在陳述x64/x32的基礎應用與x64的概念:

[.NET Framework]64位元呼叫32位元元件

[.NET Framework]WOW64的介紹

接著我們來說明一下如何在不將IIS降轉為32-bit process的情況下,也能順利呼叫32-bit的元件,前一篇文章中我們有提到,32-bit/64-bit的元件不能直接呼叫彼此,下面這段說明大家應該還記得:

However, 32-bit processes cannot load 64-bit DLLs for execution, and 64-bit processes cannot load 32-bit DLLs for execution.

其實關鍵在那個load字,我們不能把一個標示為32-bit的DLL載入到64-bits的處理緒中,在載入過程中就會檢查出這並不合理,既然不能直接呼叫,對系統整合有些經驗的人應該會想到異質系統整合時,如果不能直接呼叫對方的服務,我們可能會透過中介程式或者Web Service來溝通,而在64-bit/32-bit這個部份,我們的思路是這樣,我要從64-bit的處理緒(w3wp.exe)去呼叫一個中介程式,並透過此中介程式來呼叫32-bit的元件,而由於64-bit的處理緒並沒有直接呼叫32-bit元件,因此我們將這種做法稱為Out-Of-Process。

我們先簡單的以下圖來說明,w3wp呼叫X32的Remote host,然後由Remote host載入32-bit的DLL來執行,並回傳結果給w3wp,整個結構就是這樣,由於Remote host並不是一個被載入到w3wp處理緒中的DLL或其它元件,而是透過HttpChannel或TCPIPChannel來呼叫在Server上常駐的一個Host程式,沒有把它載入,自然也不會有64-bit/32-bit相衝突的問題出現了。image

什麼是.net Remoting,我想大家可以參考.Net Magazine技術雜誌2004年12月35期的資料,許薰尹老師的說明,想當年我還很菜的時候,看她這篇文章也搞了一個.net Remoting的架構出來,所以大家要看懂應該很簡單才是,因此remoting的概念這邊就不多講了。

除了remoting的概念之外,還有一個很重要的概念這邊也提一下讓大家知道,上圖中的Remote Host必須要是32-bit的應用程式,我們如何將該程式編譯成32-bit呢?其實很簡單,在『專案屬性』中的『建置』頁籤,平台目標選擇X86,該選項預設是Any CPU,代表可以在64-bit/32-bit下運作,但在64-bit的OS環境下執行時,預設啟動為X64的處理緒,而我們在建置時如果直接選擇為X86,則編譯好的PE header就會被加上是64-bit還是32-bit應用程式,當程式啟動時,便會自動被啟始為該種處理緒的應用程式。

(PS.Any CPU還有一個特點,就是當呼叫你的應用程式是32-bit,該元件就會以32-bit的形式被載入;反之亦然。)

image 而實際的程式結構是長這個樣子:

image 以Reomting文件中的說明,我們建立了一個RemoteObject的class,這個class繼承自MarshalByRefObject,作為Remote Host呼叫外部元件的轉接元件,並由這個元件去呼叫,而RemoteObject則被編譯成Any CPU的元件,方便處理64-bit/32-bit的元件需求。

 

整個64位元的處理內容到此告一段落,如需更進一步補充說明的,可以再提出來討論喔。

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。