2012年5月22日 星期二

.Net 1.1 的有痛升級

於 .net 1.1 ,專案名稱 UpTestWeb ,預設在 /bin 資料夾就會產生 UpTestWeb.dll。當要升級為 .net 2.0 以上時,一般都習慣使用升級精靈來自動將專案轉換為新的 .net 版本。目前我則是將 .net 1.1 升級為 .net 4.0,升級完成後,一開始執行都沒甚麼大問題,但當有需要修改程式時,才發現原先自己定義的一些類別,不管怎麼改,程式都不會去執行剛剛修改的地方,還是照著他自己的舊寫法去跑,真的還蠻奇怪的。

理論上,於 .net 4.0 時,/bin 資料夾並不會出現跟專案名稱一樣的 dll 檔,但檢視我升級後的專案,裡頭卻有一個 UpTestWeb.dll ,於是我把他砍了,接著一堆錯誤就出來了,眼睛很花,頭...很沈重。

在網路上看到許多前輩討論 .net 1.1 升級的經驗談,其中於 shang 的一篇文章「 从ASP.NET 1.1升级到2.0 」提到:「将所有独立的代码文件和AssemblyInfo.cs都被移到 App_Code 目录下」,發現自己少了這個步驟。原來,如果將與 .aspx 無關的 .cs 都移到 /App_Code ,於 .net 2.0 以後才可以讓其他程式碼存取。基本上,我們自己所定義的類別程式,都應該放在 /App_Code,若是已經編譯過的 dll 檔,則是擺放在 /Bin 下面,如此其他程式才能參考的到(Ref.ASP.NET 網站中的共用程式碼資料夾)。

在這次升級的過程中,我大致做了以下動作:

01:將與 .aspx 無關的 .cs 都移到 /App_Code
02:把 .aspx 裡的Codebehind 改成 CodeFile,同時也要調整 Inherits。舉例來說:
<%@ Page language="c#" Codebehind="Default.aspx.cs" AutoEventWireup="false" Inherits="UpTestWeb._Default" %>

換成

<%@ Page language="c#" CodeFile="Default.aspx.cs" AutoEventWireup="false" Inherits="_Default" %>

03:把 .aspx 的
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

換成

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

04:將 .aspx.cs 裡的 namespace XXX { ... } 拿掉, 並將
public class xxx : System.Web.UI.Page 改成
public partial class xxx : System.Web.UI.Page

05:於 .aspx.cs 裡,類似 protected System.Web.UI.WebControls.Label lblUserName; 這種的宣告都砍掉。

參考:


01:ASP.NET 網站中的共用程式碼資料夾

02:A Beginner's Guide to ASP.NET Application Folders

03:从ASP.NET 1.1升级到2.0

04:KB-ASP.NET 2.0 網站部署的變革

1 則留言:

  1. .net 1.1升級真的很麻煩
    有時候乾脆留皮不留骨的換成MVC或較新的程式重寫更快些(如果含後續維護)
    除非系統大到沒辦法

    回覆刪除