原文網址:http://www.blogwind.com/Wuvist/74545.shtml
===================================
非常搞,等了快一年Discuz!NT的免費版本依舊不支援64位Windows。
官方出了64位windows支援的指南居然是叫使用者把IIS設定為32位相容模式。。。說了等於沒說,這不叫在64位Windows下運行Discuz!NT,這叫如何不使用64位環境運行Discuz!NT。。。
(最鬱悶的是IIS 6是否開啟32位支援是一個全域設定,我專門為論壇開了32位支援,伺服器上別的依賴64位的程式怎麼辦?)
直接諮詢過Discuz的客服,MM很客氣,態度很好,但給的解決方案就是讓偶購買商業授權,說掏錢就一定沒問題。
但是聽得我很忐忑。。。以我自己開發程式的經驗,Discuz!NT的在64位運行故障,直接把IIS Application Pool搞崩潰,一定是程式內部的問題。。。而不是授權的問題。。。
總怕被MM給忽悠了。。。3000大元啊。。。反正Discuz!NT是開源的。。。這3000塊給自己賺不是更好?
這世界上總不會只有我運遇到這個問題。。。我就癡心的等。。。等了快一年。。。還是沒有解決。。。
今天終於怒了。。。自己動手,豐衣足食。。。
首先,下載Discuz!NT的源碼: https://svn.51aspx.com/svn/dnt
非常奇怪,Discuz!NT不用google code之類的;51aspx下載慢死。。。
本地編譯,上傳、部署debug版本。。。從官方論壇上看到,有若干網友說要編譯64位版本,甚至還說要把Discuz!NT用的幾個依賴庫也重新位64位編譯。。。我很懷疑這些網友究竟自己嘗試過沒有。。。反正,我按他們說的方法去做。。。浪費一整天不說,始終也沒有任何效果。。。
最後,祭出Debug Diagnostic Tool(感謝祖國,微軟去年底終於推出了64bit版!)神器。。。
直接用預設的Crash Rule跟蹤論壇的Application Pool進程。。。先訪問一個空aspx頁面啟動進程,之後便訪問論壇首頁。。。果然又掛了。。。而Debug Diagnostic Tools自動dump了進程出來。。。
很好。。。繼續祭出Debugging Tools For Windows神器。。。
Load dump檔案。。。執行:!analyze -v
乖乖。。。立刻顯示:
0000000003502A90 00000642788F2237 mscorlib_ni!System.AccessViolationException..ctor()+0x17
(TransitionUM)
(TransitionMU)
000000000354E6D0 0000064278ACB013 mscorlib_ni!System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[], Int32, Int32)+0x123
000000000354E760 0000064278334403 mscorlib_ni!System.Security.Cryptography.CryptoStream.FlushFinalBlock()+0x33
000000000354E7A0 00000642801D09BA Discuz_Common!Discuz.Common.DES.Decode(System.String, System.String)+0x11a
000000000354E810 00000642801D0430 Discuz_Forum!Discuz.Forum.OnlineUsers.UpdateInfo(System.String, Int32, Int32, System.String)+0xc0
000000000354E890 00000642801CE4AB Discuz_Forum!Discuz.Forum.PageBase..ctor()+0x55b
問題很明顯了。。。Discuz!NT啟動時檢查使用者資訊的代碼出錯了。。。具體是:
Discuz.Common\Encrypt.cs檔案的97行 DES類Decode函數。。。
對DES不熟,不清楚為什麼64位下運行FlushFinalBlock會出錯。。。重新將DES的decode/encode函數實現一遍。。。上傳伺服器。。。論壇首頁終於出來了。。。
淚流滿面。。。