顯示具有 Visual Studio 標籤的文章。 顯示所有文章
顯示具有 Visual Studio 標籤的文章。 顯示所有文章

2008年10月7日 星期二

Visual Studio 2008 快速切換啟始專案

之前用 Visual Studio 開發內含多個專案一的方案的時候,有碰到一個有點困擾的問題,就是時常需要切換啟始專案來做偵錯。現在發現一個好用的選項可以快速切換啟始專案 (原本要專案上按右鍵換),在方案的屬性頁裡面,將 [啟始專案] 的選項改成 [目前的選取範圍],這樣一來往後只要在專案中任何一個項目按一下就可以馬上切換成啟始專案:

image

也可以到 [工具] - [選項] - [專案與方案] - [建置並執行] 將 [讓新方案使用目前選取的專案做為啟始專案] 打勾讓它成為新方案的預設值:

image

蠻方便的一個功能。

2008年9月10日 星期三

.NET Framework 版本跟 CLR 版本

常看到很多人 (甚至是開發者) 在討論 Framework 版本的時候,對於幾個版本之間的關係還是不大了解。這也不能怪他們因為 MS 在 3.0 的時候把原來的架構破壞了。本來的架構是,一個版本就一個新的 CLR,CLR 可以向下相容 (大致上),也可以共存,開發出來的程式就是針對某個 Framework/CLR 版本,非常明瞭。但到了 Framework 3.0/3.5 之後卻演變成還是使用跟 2.0 同個 CLR 版本,只是在上面新增功能。所以其實這就是為什麼有人說就算你用 2.0,還是可以使用 3.0/3.5 的功能,只要能參考 3.0/3.5 的 DLL 就好了。下圖是 Framework 版本跟 CLR 版本的對照表:

.NET Framework 版本 CLR 版本
1.0 1.0
1.1 1.1
2.0 2.0
3.0 2.0
3.5 2.0

我想 4.0 應該真的會是連 CLR 都一起升級的大改版了吧。

Windows Vista 內建的 3.0,跟原來釋出的 3.0,以及 2.0 跟 3.0/3.5 的 關係在下面這張圖就顯示的很清楚,其中 Green Bits 跟 Red Bits 分別為微軟在開發 3.5 的時候稱 3.5 那塊跟 3.0/2.0 那塊的代號:

fx35 

出處:http://www.danielmoth.com/Blog/2007/06/net-framework-35.html

2008年9月1日 星期一

.NET Framework 原始碼

原來早在去年年底,Microsft 已經將 .NET Framework 一部分的原始碼釋放出來,讓大家在 Debug 的時候更加方便(讓你可以進入 Framework 的程式碼),而且也可以更加了解 Framework 裡面的內部結構。不過目前好像只有這幾個 DLL 有 (已更新到 SP1):

  • Mscorlib.DLL
  • System.DLL
  • System.Data.DLL
  • System.Drawing.DLL
  • System.Web.DLL
  • System.Web.Extensions.DLL
  • System.Windows.Forms.DLL
  • System.XML.DLL
  • WPF (UIAutomation*.dll, System.Windows.DLL, System.Printing.DLL, System.Speech.DLL, WindowsBase.DLL, WindowsFormsIntegration.DLL, Presentation*.dll, 以及一些其他)
  • Microsoft.VisualBasic.DLL
  • *資料來自 http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx

    使用方式非常簡單,到 [工具] - [選項] - [偵錯] 設定這兩個選項:

    1. 將 [啟用 Just My Code (僅限 Managed)] 選項停用
    2. 然後將 [啟用來源伺服器支援] 啟用

    image

    這樣就可以了。接下來在程式碼隨便一個地方設中斷點,然後執行程式讓它中斷。在呼叫堆疊的地方選一個想要看原始碼的呼叫,滑鼠按右鍵然後選 [載入符號來源] - [Microsoft 符號伺服器]。等他下載完之後堆疊裡的呼叫就不會是反白,這時在呼叫上按兩下可以就可以看原始碼了,下圖是 System.Windows.Forms.Control 的原始碼:

    image

    2008年7月30日 星期三

    VB 9.0 - 很屌的新功能 XML Literals

    到底要學 VB.NET 還是 C#? 這個問題常常被拿出來討論,而討論的結果也常常沒有結論。因為大部分人要不直接推薦他們自己擅用的語言,就是叫你選自己覺得喜歡的。其實大家心理都知道,所有 .NET 語言 compile 出來都是變成 IL,硬要說 C# 比 VB.NET 強大其實有點牽強,兩個語言的相容性絕對是 95% 以上。所以所有的 .NET 語言其實都是平等的,.NET 平台強大的地方在於它的 CLR 跟 Class Library。最近看到了一篇很有意思的文章,裡面形容 VB.NET 為「醜小鴨」,其實一點也不為過。該文章提到說「C# 使用者總有一種模糊的感覺覺得自己在寫的程式碼是既優雅又帶有性格,一定是大括弧產生的錯覺。」,非常有意思。實際上 Visual Basic Expression 版的下載次數遠大於其他版本。還是覺得 VB.NET 是個「玩具語言」嗎?微軟的 Silverlight 裡面的 Javascript Parser 就是用 VB.NET 寫的,這證明了 VB.NET 的能耐絕對足以寫出非常專業的產品。總歸一句話,軟體寫的好不好主要還是看寫的人,使用個工具或語言其次。

    好了廢話不多說,今天想來介紹一個 VB 9.0 有,但 C# 3.0 (就是 Visual Studio 2008 的 VB 跟 C# 版本) 沒有的功能 - XML Literals。簡單來講就是可以直接把 XML 打在程式碼裡面處理。表面上聽起來沒什麼了不起,但若你常需要處理 XML 檔案的話,用一次你就知道它的方便性,還有它的優雅。C# 看來不太可能會有這個功能,因為或多或少 C# 都是遵循 ANSI C 的規格,像在程式碼裡面添加 XML 這種怪招,C# 我想不大好去 Implement。廢話不多說先來看一個簡易範例,用 XML Literals 建立一個 XML 文件:

    Dim xml = <books>

    <book>

    <title>Head First Java</title>

    <price>800</price>

    </book>

    <book>

    <title>Head First HTML</title>

    <price>1000</price>

    </book>

    </books>

    同樣的 XML 用 XmlDocument:

    Dim xml As New XmlDocument

    Dim booksNode As XmlNode = xml.AppendChild(xml.CreateElement("books"))

    Dim bookNode As XmlNode = booksNode.AppendChild(xml.CreateElement("book"))

    Dim titleNode As XmlNode = bookNode.AppendChild(xml.CreateElement("title"))

    Dim priceNode As XmlNode = bookNode.AppendChild(xml.CreateElement("price"))

    titleNode.InnerText = "Head First Java"

    priceNode.InnerText = "800"

    titleNode = bookNode.AppendChild(xml.CreateElement("title"))

    priceNode = bookNode.AppendChild(xml.CreateElement("price"))

    titleNode.InnerText = "Head First HTML"

    priceNode.InnerText = "1000"

    如何,用 XML Literals 的確優雅很多吧?它讓你在處理 XML 的時候,用一種非常視覺化的方式來處理,你的 XML 文件就在你眼前,不用去想像,甚至可以透過匯入 Schema 的動作來讓你的 XML Literal 支援 Intellisense

    好建立一個 XML 文件其實只是牛刀小試,XML Literals 還支援 Embedded Expressions,用 <%= %> 來表示非常類似 ASP.NET 的,讓你可以非常快速的,而且視覺化的來動態產生/轉換 XML。下面是一個非常簡易的將上面的 XML Tranform 成 HTML 的範例:

    Dim output = <html>

    <head><title>Books</title></head>

    <body>

    <p>

    <table>

    <tr><td>書名</td><td>價錢</td></tr>

    <%= From book In xml...<book> Select <tr><td><%= book.<title>.Value %></td><td><%= book.<price>.Value %></td></tr> %>

    </table>

    </p>

    </body>

    </html>

    出來的結果就是:

    image

    非常神奇,不需要去玩 XSLT,也不用甚麼程式碼,直接在 XML Literal 裡面定義就好了。

    XML Literal 的功能也還有一種另類的玩法 - 就是拿來當字串,尤其是多行的字串如 SQL 指令,還有用來取代 String.Format(),請看下面的範例:

    舊寫法,用 & _

    Dim str As String = "這是一段" & vbCrLf & _

    "超過三行" & vbCrLf & _

    "以上的" & vbCrLf & _

    "文字"

    MsgBox(str)


    新寫法,乾淨許多

    Dim xmlLitString = <string>

    這是一段

    超過三行

    以上的

    文字

    </string>.Value

    透過 Embedded Expression 的支援,就可以達到 String.Format() 的效果,但是直接寫在 XML Literal 碼裡面,不用一直加參數跟 placeholder:

    舊方式,用 String.Format(),當你的參數越來越多的時候就會變的複雜,不好更新

    Dim msg = String.Format("{0}! 現在是{1}" & vbCrLf & _

    "你的登入帳號為 {2}" & vbCrLf & _

    "電腦叫做 {3}" & vbCrLf & _

    "作業系統為 {4}", If(Now.Hour > 9 Or Now.Hour < 4, "晚安", "你好"), Now.ToString(), My.User.Name, My.Computer.Name, My.Computer.Info.OSFullName)

    MsgBox(msg)


    新寫法,更改方便,不容易出錯

    Dim xmlLitMsg = <string>

    <%= If(Now.Hour > 9 Or Now.Hour < 4, "晚安", "你好") %>! 現在是<%= Now.ToString() %>

    你的登入帳號為 <%= My.User.Name %>

    電腦叫做 <%= My.Computer.Name %>

    作業系統為 <%= My.Computer.Info.OSFullName %>

    </string>.Value

    MsgBox(xmlLitMsg)

    講了這麼多主要還是想讓大家知道,VB.NET 是個成熟的 .NET 語言,功能上絕對不比 C# 遜色。感覺上使用 C# 的人好像比較多其實主要還是因為是很多人有 C/C++/Java 背景,這些人看熟 C 的語法了,自然對 C# 容易上手,沒有必要花時間去鑽研 VB.NET (雖然我知道很多高手兩個都很厲害),並不是因為 VB.NET 是個比較拙劣的語言。

    其實現在 C# 跟 VB.NET 兩者都有很多很好資源,範例可以學習,在這裡還是奉勸大家兩個都學,才不會碰到找到一個解決你問題的範例但是看不懂的窘境。你可以比較熟一個,但至少另一個的基本語法也要看的懂。如果真的沒辦法,沒時間的話,至少有轉換器可以用 :-)。