Đồ án Giới thiệu sơ bộ về .NET và C# cùng với một số vấn đề nâng cao trong ngôn ngữ C#

Trong suốt bản báo cáo này, chúng em đã trình bày một vài đặc điểm cũng như khả năng của C#, cụ thể là các đặc điểm về hệ thống nền .NET cùng với ngôn ngữ C#, các khả năng của C# trong các lĩnh vực đồ hoạ, thực hiện tính toán song song, lập trình mạng. Chúng em cững đã đưa ra một vài so sánh, nhận xét về C# trong sự tương quan với các ngôn ngữ khác. Có thể thấy rằng, C# là ngôn ngữ hiện đại, đơn giản, song có khả năng cao trong việc phát triển các dự án phần mềm. C# có đầy đủ các tính năng tốt của các ngôn ngữ trước đó đồng thời hạn chế đi nhiều lỗi mà các ngôn ngữ trước mắc phải. C# mới ra đời được 3 năm, nó là ngôn ngữ còn đang trong giai đoạn phát triển để hoàn thiện, vào điểm này, khó có thể đánh giá toàn bộ các ưu nhược điểm của C#. Trong tương lai, C# có lẽ sẽ trở thành ngôn ngữ lập trình thông dụng nhất. Chúng em xin kết thúc đề tài tại đây. Chúng em xin chân thành cảm ơn thày giáo Nguyễn Ngọc Bình đã hướng dẫn chúng em tiếp cận và thực hiện đề tài này.

doc81 trang | Chia sẻ: oanh_nt | Lượt xem: 1499 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Đồ án Giới thiệu sơ bộ về .NET và C# cùng với một số vấn đề nâng cao trong ngôn ngữ C#, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ation) x¸c ®Þnh c¸c khai b¸o ‘®¸nh dÊu’ cã n»m ngoµi tµi liÖu hay kh«ng.VÝ dô : Khai b¸o kiÓu tµi liÖu: khai b¸o kiÓu tµi liÖu chøa c¸c code ‘®¸nh dÊu’ x¸c ®Þnh c¸c quy t¾c ng÷ ph¸p hay cßn gäi lµ DTD ( Document Type Definition) cho mét líp ®Æc biÖt nµo ®ã trong tµi liÖu. Khai b¸o nµy cßn cã trá tíi c¸c file kh¸c chøa c¸c DTD. Khai b¸o nµy ph¶i ®i sau khai b¸o kiÓu XML vµ ®øng tr­íc c¸c thµnh phÇn cña tµi liÖu.VÝ dô nh­ khai b¸o sau: Khai b¸o nµy b¸o cho tr×nh xö lÝ XML biÕt ®­îc tµi liÖu nµy thuéc líp Detail vµ nã ph¶i tu©n theo c¸c quy ®Þnh ®­îc ®Þnh nghÜa trong file ‘Dtl.dtd’. TiÕp theo lµ c¸c thµnh phÇn cña tµi liÖu, phÇn chÝnh cña mét tµi liÖu XML, n¬i chøa c¸c néi dung chÝnh. C¸c thµnh phÇn tµi liÖu nµy cßn cã thÓ bao gåm c¸c thµnh phÇn tµi liÖu con vµ c¶ c¸c thùc thÓ ngoµi. XML cã cÊu tróc c©y, nã bao gåm mét thµnh phÇn gèc vµ c¸c thµnh phÇn con sau ®ã lµ c¸c thµnh phÇn kÕ tiÕp (cã thÓ rçng). Mçi thµnh phÇn cã tªn vµ cã thÓ cã c¸c thuéc tÝnh. VÝ dô: H×nh 17 Khai b¸o thµnh phÇn trong XML III.1.2. CÊu tróc vËt lÝ CÊu tróc vËt lÝ cña XML chøa d÷ liÖu thùc ®­îc sö dông trong tµi liÖu XML. C¸c d÷ liÖu nµy cã thÓ lµ v¨n b¶n chøa trong bé nhí m¸y tÝnh, file h×nh ¶nh trªn World Wide Web... NÕu nh­ cÊu tróc logic lµ b¶n thiÕt kÕ ng«i nhµ th× cÊu tróc vËt lÝ chÝnh lµ kh«ng gian thËt chøa ng«i nhµ ®ã. Ng«i nhµ cã chøa c¸c ®å ®¹c hay gäi lµ c¸c thùc thÓ. Mçi mét thùc thÓ cã tªn riªng vµ cã néi dung riªng, néi dung nµy cã thÓ n»m trong tµi liÖu hoÆc lµ mét file ngoµi tµi liÖu. C¸c thùc thÓ ®­îc khai b¸o trong phÇn ‘prolog’ vµ ®­îc tham chiÕu trong c¸c thµnh phÇn cña tµi liÖu. Thùc thÓ chia lµm hai lo¹i lµ thùc thÓ ph©n t¸ch vµ thùc thÓ kh«ng ph©n t¸ch. Thùc thÓ ph©n t¸ch hay cßn ®­îc gäi lµ thùc thÓ v¨n b¶n ,chøa c¸c d÷ liÖu v¨n b¶n ,trê thµnh mét phÇn cña tµi liÖu XML .Khi mét tr×nh xö lÝ XML ph©n t¸ch c¸c thùc thÓ nµy ,néi dung cña chóng xuÊt hiÖn nh­ mét phÇn cña tµi liÖu t¹i n¬i tham chiÕu thùc thÓ .VÝ dô nh­ ta cã khai b¸o nh­ sau : . Mçi khi thùc thÓ ®­îc tham chiÕu trong tµi liÖu th× néi dung cña nã sÏ ®­îc ®Æt vµo n¬i tham chiÕu ®ã. NÕu muèn thay ®æi néi dung cña thùc thÓ th× ta chØ cÇn thay ®æi ë khai b¸o, sau ®ã thay ®æi nµy ®­îc ¸nh x¹ tíi nh÷ng n¬i mµ tham chiÕu tíi thùc thÓ. Thùc thÓ kh«ng ph©n t¸ch ®­îc coi nh­ lµ mét thïng chøa mµ néi dung cña nã cã thÓ cã hay kh«ng cã v¨n b¶n .Thùc thÓ kh«ng ph©n t¸ch ®­îc ®«i khi cßn cã tªn lµ thùc thÓ nhÞ ph©n bëi v× néi dung cña nã th­êng lµ file nhÞ ph©n(vÝ dô nh­ file ¶nh) vµ tr×nh xö lÝ XML kh«ng trùc tiÕp th«ng dÞch ®­îc .Khai b¸o mét thùc thÓ kh«ng ph©n t¸ch ®­îc cÇn mét chó thÝch ®Ó x¸c ®Þnh kiÓu ®Þnh d¹ng hay kiÓu hay nguån cña thùc thÓ .VÝ dô nh­ khai b¸o sau : . Ngoµi ra c¸c chó thÝch còng cÇn ®­îc khai b¸o. C¸c khai b¸o chó thÝch gióp cho tr×nh xö lÝ XML thao t¸c trªn c¸c file nhÞ ph©n. VÝ dô nh­ ta cã thÓ khai b¸o chó thÝch cho vÝ dô trªn :. Thùc thÓ tiÒn ®Þnh nghÜa:Trong XML mét sè kÝ tù nµo ®ã ®­îc sö dông ®Ó ‘®¸nh dÊu’ tµi liÖu.Trong vÝ dô sau thµnh phÇn Person ®­îc xem nh­ lµ mét ‘®¸nh dÊu’ vµ kh«ng ®­îc coi lµ d÷ liÖu kÝ tù : Bill. Theo W3C tÊt c¶ c¸c tr×nh xö lÝ XML ®Òu nhËn biÕt c¸c tham chiÕu thùc thÓ tiÒn ®Þnh nghÜa mÆc dï c¸c thùc thÓ nµy kh«ng ®­îc khai b¸o. V× vËy chØ cã c¸c thùc thÓ ®­îc khai b¸o trong DTD cña tµi liÖu míi ®­îc xem lµ hîp lÖ. Néi thùc thÓ trong vµ ngo¹i thùc thÓ: Thùc thÓ trong lµ c¸c thùc thÓ mµ néi dung cña nã xuÊt hiÖn trong phÇn khai b¸o (vÝ dô trªn E lµ néi thùc thÓ ) tøc lµ kh«ng tån t¹i mét ®¬n vÞ vËt lÝ t¸ch biÖt nµo chøa nã. Thùc thÓ ngoµi lµ nãi ®Õn mét ®¬n vÞ chøa trong khai b¸o cña nã b»ng c¸ch sö dông c¸c ®Þnh danh hÖ thèng hoÆc ®Þnh danh c«ng céng. VÝ dô nh­ khai b¸o sau: <!ENTITY MyImage SYSTEM “ NDATA GIF> Trong vÝ dô nµy tr×nh xö lÝ XML ph¶i ®äc file I1.gif ®Ó lÊy néi dung. Ngoµi ra c¸c ®Þnh danh c«ng céng ®­îc sö dông nÕu nh­ tr×nh øng dông ®­îc kÕt nèi víi mét th­ viÖn tµi liÖu c«ng céng. VÝ dô khai b¸o sau: <!ENTITY MyImage PUBLIC “-//Image//TEXT Standard images//EN” “ NDATA GIF> III.2. Có ph¸p XML Trong phÇn nµy chóng ta t×m hiÓu có ph¸p c¬ b¶n cña tµi liÖu XML. V× HTML vµ XML ®Òu lµ c¸c øng dông tõ SGML nªn ®èi víi nh÷ng ai ®· tõng lµm viÖc víi HTML sÏ thÊy mét sè ®iÓm t­¬ng ®ång vÒ có ph¸p gi÷a chóng tuy lµ chóng kh«ng hoµn toµn cã cïng ý nghÜa. III.2.1. C¸c thÎ g¸n vµ phÇn tö Trong HTML, c¸c thµnh phÇn th­êng sö dông c¸c thÎ ®ãng vµ thÎ më vÝ dô nh­ “ vµ “”. Do HTML ®­îc gi¶n l­îc bít nªn ë mét sè chç mÆc dï kh«ng cã thÎ ®ãng nh­ng tr×nh xö lÝ vÉn hiÓu ®­îc. Tuy nhiªn XML kh«ng cho phÐp ®iÒu ®ã, mçi mét thÎ më trong XML ph¶i lu«n tån t¹i mét thÎ ®ãng t­¬ng øng. §iÒu nµy lµm cho có ph¸p cña XML chÆt chÏ vµ s¸ng sña h¬n so víi HTML. Ta xem vÝ dô sau: John Bill H×nh 18 Minh häa cÊu tróc c©y cña vÝ dô Trong XML c¸c kÝ tù gi÷a ®­îc gäi lµ thÎ g¸n XML. C¸c thÎ g¸n ph¶i ®i cÆp víi nhau lµ thÎ g¸n ®Çu vµ thÎ g¸n cuèi. C¸c thÎ g¸n cuèi gièng nh­ thÎ g¸n ®Çu nh­ng cã thªm mét dÊu ‘/’ n»m sau kÝ tù më ‘ vµ thÎ g¸n cuèi . Trong XML kh«ng cho phÐp c¸c thÎ g¸n ®­îc lång nhau. Toµn bé th«ng tin n»m tõ ®Çu cña thÎ g¸n ®Çu ®Õn cuèi cña thÎ g¸n cuèi gäi lµ mét phÇn tö . V¨n b¶n gi÷a thÎ ®Çu vµ thÎ cuèi gäi lµ néi dung thµnh phÇn. VÝ dô nh­ John lµ mét thµnh phÇn. C¸c thÎ thµnh phÇn rçng kh«ng chøa néi dung vµ cã cÊu tróc nh­ sau : . XML cho phÐp viÕt rót gän l¹i thµng : Toµn bé t­ liÖu b¾t ®Çu t¹i vµ kÕt thóc t¹i còng lµ mét thµnh phÇn, cã thÓ bao gåm c¸c thµnh phÇn kh¸c. Trong tr­êng hîp nµy nã ®­îc gäi lµ thµnh phÇn gèc. Mçi t­ liÖu XML ®Òu ph¶i cã mét thµnh phÇn gèc. TÊt c¶ c¸c thµnh phÇn kh¸c ®Òu lµ thµnh phÇn hËu duÖ cña thµnh phÇn gèc nµy. XML cho phÐp ng­êi sö dông ®Æt tªn c¸c thµnh phÇn rÊt tho¶i m¸i v× XML kh«ng cã c¸c tõ kho¸ cÇn ph¶i tr¸nh nh­ trong c¸c ng«n ng÷ lËp tr×nh. Tuy nhiªn ta cÇn tu©n theo c¸c qui t¾c sau : C¸c tªn b¾t ®Çu b»ng c¸c kÝ tù hoÆc dÊu ‘_’ nh­ng kh«ng ®­îc lµ c¸c con sè. C¸c tªn kh«ng ®­îc chøa kho¶ng c¸ch ,kÝ tù ‘;’... vµ kh«ng ®­îc b¾t ®Çu b»ng xml Kh«ng thÓ cã dÊu c¸ch ngay sau kÝ tù ‘’ Trong XML ph©n biÖt ch÷ hoa vµ ch÷ th­êng. VÝ dô ®Æt tªn kh«ng hîp lÖ : , , ... III.2.2. C¸c thuéc tÝnh vµ chó gi¶i C¸c thuéc tÝnh cung cÊp ph­¬ng ph¸p g¾n gi¸ trÞ vµo c¸c thµnh phÇn mµ kh«ng cÇn coi nã lµ mét phÇn cña néi dung thµnh phÇn .C¸c thuéc tÝnh t¸ch biÖt d÷ liÖu mµ hÇu hÕt c¸c øng dông cÇn ra khái d÷ liÖu mµ c¸c øng dông kh«ng cÇn .VÝ dô nh­: Bill C¸c chó gi¶i trong XML b¾t ®Çu b»ng chuçi ‘ XML kh«ng cho phÐp viÕt chó gi¶i trong mét thÎ g¸n. Cã mét vµi kÝ tù mµ XML kh«ng cho phÐp chóng xuÊt hiÖn trùc tiÕp trong thµnh phÇn d÷ liÖu vÝ dô nh­ ‘&’,’>’...Muèn sö dông chóng ta cã hai c¸ch: Dïng tham chiÕu thùc thÓ :& thay cho kÝ tù & ,> thay cho kÝ tù >... Dïng c¸c ®o¹n CDATA(Character DATA) .§©y lµ mét ®Æc ®iÓm XML kÕ thõa tõ SGML.Mäi néi dung xuÊt hiÖn gi÷a ®Òu ®­îc c¸c tr×nh xö lÝ XML bá qua .VÝ dô : =6 & 7. IV. XML trong C# Trong phÇn nµy chóng ta t×m hiÓu c¸ch thøc C# hç trî chuÈn XML. Trong C# cã cung cÊp mét kh«ng gian tªn System.Xml bao gåm nhiÒu tiÖn Ých ®Ó ta cã thÓ lµm viÖc víi c¸c tµi liÖu XML. Do giíi h¹n vÒ thêi gian, tµi liÖu nªn trong phÇn nµy chóng em chØ ®i s©u vµo mét sè vÊn ®Ò chÝnh. IV.1. T¹o mét tµi liÖu XML Gi¶ sö ta muèn t¹o mét tµi liÖu XML cã cÊu tróc nh­ sau: Ch­¬ng tr×nh sau sÏ t¹o ra file ‘c:\car.xml’ using System; using System.IO; using System.Xml; using System.Text; class CarDomWriter { CarDomWriter(Stream outStr){ XmlDocument doc = new XmlDocument(); XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "UTF-8", null); doc.AppendChild(decl); XmlNode root = CreateCarNode(doc); doc.AppendChild(root); XmlTextWriter writer = new XmlTextWriter(outStr, new UTF8Encoding()); writer.Formatting = Formatting.Indented; doc.WriteTo(writer); writer.Flush(); writer.Close(); } XmlNode CreateCarNode(XmlDocument doc){ XmlElement car = doc.CreateElement("Car"); car.SetAttribute("VIN","123"); XmlNode model = CreateModelNode(doc); car.AppendChild(model); XmlNode miles = CreateMilesNode(doc); car.AppendChild(miles); return car; } XmlNode CreateModelNode(XmlDocument doc){ XmlElement model = doc.CreateElement("Model"); XmlElement year = doc.CreateElement("Year"); year.InnerText = "1998"; model.AppendChild(year); XmlElement mfr = doc.CreateElement("Maker"); mfr.InnerText = "Honda"; model.AppendChild(mfr); XmlElement make = doc.CreateElement("Make"); make.InnerText = "Civic"; model.AppendChild(make); return model; } XmlNode CreateMilesNode(XmlDocument doc){ XmlElement miles = doc.CreateElement("Mileage"); miles.SetAttribute("Units", "Miles"); miles.InnerText = "80000"; return miles; } public static void Main(){ FileStream outStr = new FileStream( "c:\\car.xml",FileMode.Create); try { new CarDomWriter(outStr); } finally { outStr.Close(); } } }///:~ Thao t¸c ®Çu tiªn lµ t¹o mét ®èi t­îng XmlDocument, sau ®ã ta lÇn l­ît t¹o ra c¸c node vµ g¾n chóng vµo XmlDocument. Ta g¾n mét node võa t¹o b»ng ph­¬ng thøc XmlDocument.AppendChild(). Sau khi t¹o khai b¸o ( coi nh­ mét node vµ g¾n vµo XmlDocument ), ta t¹o node gèc lµ Car. Cø tiÕp tôc qu¸ tr×nh t¹o ra c¸c node tiÕp theo, nÕu node nµo ®ã cã thuéc tÝnh ta dïng ph­¬ng thøc XmlElement.SetAttribute(). Sau khi h×nh thµnh ®­îc cÊu tróc XML, ta t¹o mét ®èi t­îng XmlTextWriter ®Ó cã thÓ ghi lªn luång file ra FileStream.XmlDocument.WriteTo() nhËn XmlTextWriter lµm tham sè, vµ ghi lªn ®ã cÊu tróc cña tµi liÖu XML. Thao t¸c cuèi cïng lµ ®Èy d÷ liÖu ë bé nhí vµo luång file ra b»ng viÖc gäi ph­¬ng thøc XmlTextWriter.Close(). Xem kÕt qu¶ b»ng tr×nh duyÖt IE 6.0: H×nh 19 KÕt qu¶ ch­¬ng tr×nh t¹o tµi liÖu trªn IE 6.0 IV.2. DuyÖt tµi liÖu XML Gi¶ sö sau khi ®· t¹o ra tµi liÖu XML nh­ trªn, ta muèn duyÖt tµi liÖu ®ã. Trong C# tån t¹i hai kiÓu duyÖt ®ã lµ duyÖt theo luång vµ duyÖt theo c©y. DuyÖt theo luång lµ duyÖt mµ ë ®ã ta më mét luång d÷ liÖu vµo vµ duyÖt luång d÷ liÖu nµy mét c¸ch liªn tôc kh«ng qua bé ®Öm vµ kh«ng cÇn t¹o ra ®èi t­îng cho mçi node. C¸ch duyÖt nµy t¨ng hiÖu n¨ng cña qu¸ tr×nh duyÖt vµ øng dông cho c¸c tµi liÖu XML cì lín. C¸ch duyÖt thø hai lµ duyÖt theo c©y, ë ®©y toµn bé cÊu tróc cña file ®­îc t¶i vµo bé nhí sau ®ã ta tiÕn hµnh duyÖt theo tõng node. Qu¸ tr×nh duyÖt sö dông thuËt to¸n ®Ö qui. Trong vÝ dô d­íi ®©y ta sö dông c¸ch duyÖt theo c©y: Ch­¬ng tr×nh sau sÏ duyÖt file ‘c:\car.xml’ using System; using System.IO; using System.Xml; class CarReader { CarReader(string fileName){ XmlDocument doc = new XmlDocument(); doc.Load(fileName); WriteInfo(doc); } void WriteInfo(XmlNode node){ Console.WriteLine("Current node is of type {0}", node.NodeType); if (node.NodeType == XmlNodeType.Element) { Console.WriteLine("", node.Name); foreach(XmlAttribute att in node.Attributes){ Console.WriteLine("[{0}] = {1}", att.Name, att.Value); } } if (node.NodeType == XmlNodeType.Text) { Console.WriteLine("Text = " + node.Value); } foreach(XmlNode child in node.ChildNodes){ WriteInfo(child); } } public static void Main(){ new CarReader("c:\\car.xml"); } }///:~ KÕt qu¶ thu ®­îc nh­ sau: IV.3. Qu¸ tr×nh Serializing Kh«ng gian tªn System.Xml.Serialization cung cÊp cho chóng ta kh¶ n¨ng chuyÓn ®æi tõ t­ liÖu XML sang c¸c d¹ng cÊu tróc d÷ liÖu kh¸c trªn cïng mét miÒn (Deserializing) vµ chuyÓn tõ tËp c¸c ®èi t­îng cã thÓ t¹o ra mét t­ liÖu XML chuÈn (Serializing). Qu¸ tr×nh serializing chØ chuyÓn ho¸ c¸c thuéc tÝnh public cña mét ®èi t­îng (hoÆc lµ tr­êng public cña mét ®èi t­îng –tuy nhiªn Ýt dïng). Bªn c¹nh ®ã qu¸ tr×nh chuyÓn ho¸ yªu cÇu líp cña ®èi t­îng lµ líp public vµ hµm khëi t¹o kh«ng cã tham sè truyÒn vµo. §iÒu nµy ®Ó tr¸nh xung ®ét gi÷a tr¹ng th¸i trong cña mét ®èi t­îng. Ta xÐt vÝ dô trªn, ta t¹o mét ®èi t­îng tõ líp Car, víi c¸c thuéc tÝnh public vµ øng víi mçi thuéc tÝnh cña ®èi t­îng nÕu ta muèn sau qu¸ tr×nh chuyÓn ho¸ nã ®­îc chuyÓn thµnh thuéc tÝnh cña thµnh phÇn cña XML th× ta thªm [XmlAttribute] vµo tr­íc ®o¹n code ®ã. Sau khi t¹o ®èi t­îng råi, ta tiÕn hµnh chuyÓn ho¸ b»ng c¸ch t¹o ra mét XmlSerializer vµ dïng ph­¬ng thøc XmlSerializer.Serialize() víi tham sè lµ ®èi t­îng c vµ mét XmlTextWriter ®Ó ghi ra dßng file. Sau ®©y lµ code: using System; using System.Xml.Serialization; using System.IO; using System.Text; using System.Xml; public class Car { public Car(){ } string vin; [XmlAttribute] public string VIN{ get { return vin;} set { vin = value;} } Model model; public Model Model{ get { return model;} set { model = value;} } Mileage miles; public Mileage Mileage{ get { return miles;} set { miles = value;} } public static void Main(){ Car c = new Car(); c.VIN = "123"; c.Model = new Model(1998, "Honda", "Civic"); c.Mileage = new Mileage("Miles", 80000); XmlSerializer xs = new XmlSerializer(typeof(Car)); FileStream outStr=new FileStream(“c:\\ser_car.xml”, FileMode.Create); XmlTextWriter writer=new XmlTextWriter(outStr, new UTF8Encoding()); writer.Formatting=Formatting.Indented; xs.Serialize(writer, c); writer.Flush(); writer.Close(); } } public class Model { public Model(){ } public Model(int yr, string mfr, string make){ this.yr = yr; this.mfr = mfr; this.make = make; } int yr; public int Year{ get { return yr;} set { yr = value;} } string mfr; [XmlElement("Maker")] public string Maker{ get { return mfr;} set { mfr = value;} } string make; public string Make{ get { return make;} set { make = value;} } } public class Mileage { string units; [XmlAttribute("Units")] public string Units{ get { return units;} set { units = value;} } int val; [XmlText] public int Quantity{ get { return val;} set { val = value;} } public Mileage(){ } public Mileage(string units, int val){ this.units = units; this.val = val; } } H×nh 20 KÕt qu¶ vÝ dô Serializing trªn IE 6.0 IV.4. Qu¸ tr×nh Deserializing §©y lµ qu¸ tr×nh ng­îc l¹i so víi qu¸ tr×nh Serializing. Qu¸ tr×nh chuyÓn ho¸ sÏ chuyÓn mét t­ liÖu XML thµnh mét ®èi t­îng cïng kiÓu. VÝ dô sau ,ta chuyÓn tµi liÖu XML ‘c:\car.xml’ thµnh ®èi t­îng car t­¬ng øng víi ®iÒu kiÖn ta ph¶i khai b¸o líp Car trong ch­¬ng tr×nh (nh­ vÝ dô phÇn tr­íc).KÕt qu¶ ®­îc kÕt xuÊt ra console: using System; using System.IO; using System.Xml.Serialization; public class CarFromFile { public static void Main(){ XmlSerializer xs = new XmlSerializer(typeof(Car)); FileStream str = new FileStream("c:\\car.xml", FileMode.Open); Car c = (Car) xs.Deserialize(str); str.Close(); Console.WriteLine("{0} {1} {2}, {3} {4}", c.Model.Year, c.Model.Maker, c.Model.Make, c.Mileage.Quantity, c.Mileage.Units); } }///:~ KÕt qu¶ nh­ sau: 1998 Honda Civic, 80000 Miles PhÇn V: LËp tr×nh m¹ng trong C# Công nghệ Web có tính thương mại cao đối với bất kỳ nền công nghiệp nào mà giá trị nhận được từ luồng chảy của thông tin, có thể nói đối với tất cả các ngành công nghiệp. Khi mà các máy desktop là những nhà quản lý sự kế thừa, thì các khía cạnh lập trình được phát triển theo 2 hướng chính: một là trên server và hai là trên các thiết bị post_dessktop như handhelds, tablets, và phones. Công việc lập trình trên các thiết bị non_desktop không bị phụ thuộc vào các nền tảng cơ bản khác như lập trình “enterprise” hay “mobile”. Hơn thế n÷a, các thuộc tính, quản lý bộ nhớ và tiến trình, các kiến trúc cơ sỡ dữ liệu của ADO.NET và sức mạnh của XML đã được bổ sung thêm vào sự hổ trợ hướng đối tượng một cách hoàn toàn trong ngôn ngữ lập trình C#. I. Giíi thiÖu vÒ lËp tr×nh m¹ng Lập trình mạng trong .NET thật dể dàng. Đặc điểm của các chương trình ứng dụng mạng với công nghệ .NET là có rất nhiều mã code được cung cấp sẵn. Khuynh hướng này được mang lại một cách đầy đủ với WebmethodAttribute. WebmethodAttribute dường như một cách thường xuyên khi thể hiện các phương thức trong lập trình Web. Chúng ta sẽ xem xÐt một cách rõ ràng cách để chuyển dữ liệu lưu thông trên mạng. I.1. NhËn d¹ng m¸y Trước tiên chúng ta sẽ học cách để nhận dạng machine. Tất nhiên, để giao tiếp với một máy từ máy khác phải chắc chắn rằng bạn đã kết nối với máy mà bạn muốn giao tiếp, chính vì thế phải có một số cách để nhận dạng các máy riêng biệt trên một mạng. Trước đây, một chuẩn thống nhất được đưa ra với mạng cục bộ. Tuy nhiên với IP(Internet Protocol) trở thành một chuẩn thường được sử dụng nhất trong việc kết nối giữa các máy tính. Đó chính là sự thành công của địa chỉ IP, chỉ với 32 bit số để mô tả. Theo đó DNS (Domain Name Service) được sữ dụng để tìm kiếm các địa chỉ IP đó. .NET cung cấp lớp IPAddress để đóng gói các địa chỉ. Chóng ta có thể tạo một địa chỉ IPAddress với 32 bit số đặc biệt, nhưng dùng phương thức IPAddress.Parse() để tạo nên một địa chỉ IP hoặc sữ dụng các phương thức như Resolve() hay GetHostByName() của lớp Dns. Chương trình sau sử dụng phương thức Dns.GetHostByName() để tạo ra địa chỉ IP của bạn. Để sử dụng hiệu quả chóng ta nên biết tên máy của m×nh. //:c18:WhoAmI.cs //Resolves current IP addresses using System; using System.Net; class WhoAmI { public static void Main(string[] args){ string machineName = args.Length == 0 ? "localhost" : args[0]; IPHostEntry addresses = Dns.GetHostByName(machineName); foreach(IPAddress ip in addresses.AddressList){ Console.WriteLine(ip); } } }///:~ Nếu chạy nó không có tham số trong dòng lệnh , nó sẽ trả về địa chỉ “localhost” đó là 127.0.0.1 .Bạn có thể dùng nó để tìm địa chỉ IP của trang www.microsoft.com. Thêm vào phần địa chỉ, IP còn sử dụng thêm một định vị đặc biệt thứ hai gọi là Port. Port cã thÓ xem nh­ lµ mét cæng l« - gic qui ®Þnh n¬i ra, vµo d÷ liÖu cña c¸c ch­¬ng tr×nh. C¸c ch­¬ng tr×nh sÏ lu«n ‘l¾ng nghe’ t¹i c¸c Port xem cã d÷ liÖu vµo hay kh«ng vµ khi nã cÇn chuyÓn d÷ liÖu cho tr­¬ng tr×nh kh¸c nã còng ph¶i chuyÓn ®Õn ®óng Port qui ®Þnh cña ch­¬ng tr×nh ®ã. I.2. Socket Trong giao thøc m¹ng m¸y tÝnh TCP/IP, mét Socket bao gåm mét ®Þa chØ IP vµ mét ®Þa chØ cæng. Dữ liệu chuyển qua Internet được chia thành các gói, mỗi gói chứa một header bao gồm thông tin địa chỉ và lượng dữ liệu. Công nghệ .NET thùc hiÖn chóng thông qua Sockets và các lớp liên quan trong không gian tên System.Net.Sockets. Trong .NET Framework chóng ta sö dụng một socket để kết nối hai máy, tiếp đến chóng ta sẽ có một NetworkStream cho phép thao tác socket giống như thao tác với các đối tượng vào ra bình thường khác. Chóng ta có được NetworkStream này từ lớp Socket thông qua sö dụng một TcpListener giống như một server dùng để lắng nghe các yêu cầu kết nối và một TcpClient dùng giống như một client để khởi tạo kết nối. Trước tiên client sẽ tạo một socket kết nối và TcpListener sẽ trả lời bằng phương thức AcceptTcpClient(). Tiếp theo chóng ta có một kết nối giữa TcpClient và một TcpClient. Lúc này chóng ta sử dụng TcpClient.GetStream() để tạo ra một đối tượng NetworkStream từ mỗi TcpClient. Tiếp nhận sự kết nối: Để tạo ra một server của chính chóng ta, chóng ta sẽ phải sữ dụng lớp TcpLístener. Chương trình sau sẽ là một ví dụ để tạo ra một server rất đơn giản. Nhiệm vụ của server là chờ kết nối, dùng TcpClient để sản xuất ra một NetworkStream. Sau đó, mọi thứ được đọc vào sẽ được hiện ra trên màn hình server, đến khi gặp dòng END thì ngừng kết nối. Client tạo một kết nối với server sau đó tạo một NetworkStream. Các dßng text sẽ được gửi theo các Stream và các dòng nhận được sẽ in ra trên màn hình Console : using System; using System.Net; using System.Net.Sockets; using System.IO; public class JabberServer { // Choose a port outside of the range 1-1024: public static readonly int PORT = 1711; public static void Main(){ TcpListener server = new TcpListener(PORT); TcpClient cnxn = null; try { server.Start(); Console.WriteLine("Started: " + server); // Blocks until a connection occurs: cnxn = server.AcceptTcpClient(); Console.WriteLine( "Connection accepted: "+ cnxn);C# StreamReader reader = new StreamReader(cnxn.GetStream()); StreamWriter writer = new StreamWriter(cnxn.GetStream()); writer.AutoFlush = true; Console.WriteLine("Beginning receive loop"); while (true) { String str = reader.ReadLine(); if (str == "END") break; Console.WriteLine("Echoing: " + str); writer.WriteLine(str); } //Close connection, stop server } finally { try { Console.WriteLine("closing..."); cnxn.Close(); } finally { server.Stop(); } } } }///:~ Chóng ta có thể thấy là TcpListener chỉ cần chỉ số của port, không phải là một địa chỉ IP (tính khi chạy trên chính máy này). Chóng ta gọi phương thức TcpListener.Start() và TcpListener.Stop() để điều khiển khi chóng ta muốn lắng nghe từ cổng. Sau khi đã gọi TcpListener.Start(), gọi TcpListener.AcceptTcpClient(), khối này sẽ lặp cho đến khi nhận được kết nối đến nó. Nghĩa là nó sẽ chờ kết nối nhưng các quá trình khác vẩn tiếp tục chạy. Khi kết nối được thiết lập, TcpListener.AcceptTcpClient() trả về đối tượng TcpClient đại diện cho kết nối đó. Sự phản hồi được quét dọn một cách thủ công ở đây. Bộ try-finally được sử dụng để đảm bảo rằng cả đóng TcpClient cnxn và dừng TcpListener. Nếu ServerSocket khởi tạo bị lỗi, chương trình sẽ thoát ra ngoài. Trong trường hợp này, main( ) tung ra IOException nên khối lệnh try không được dùng. Nếu ServerSocket khởi tạo thành công thì tất cả các phương thức khác được gọi phải được che trong khối try-finally để bảo vệ nó. Giá trị logic dùng trong Socket được trả về bởi Accept(). Nếu Accept bị lỗi thì chúng ta phải thừa nhận rằng Socket không tồn tại và giữ bất cứ tài nguyên nào, cho nên nó không cần được dọn sạch. Nếu thành công, tuy nhiên, tùy thuộc nằm trong khối try-finally thì nếu nó bị lỗi Socket sẽ vẫn được làm sạch. Cẩn thận với yêu cầu ở đây Socket dùng các tài nguyên quan trọng không chiếm trong bộ nhớ. Phần tiếp theo trông giống như việc mở một files và thực hiện các thao tác đọc ghi trên file. StreamReader và StreamWriter được tạo từ đối tượng NetworkStream được trả về bởi TcpClient.GetStream(). Đối tượng StreamWriter có thuộc tính Autoflush được thiết lập bằng true sau mỗi lần gọi StreamWriter.Write( ) hay StreamWriter.WriteLine( ) bộ đệm sẽ được gửi qua mạng. Làm sạch Flushing thật quan trọng trong ví dụ này vì máy client và server mỗi lần đợi bộ phận kia trước khi xử lý. Nếu flushing không được thực hiện, thông tin có thể không được gửi lên mạng cho đến khi bộ đệm bị tràn. Kết quả trong chương trình chỉ ngồi chờ sau khi kết nối được khởi tạo. Khi viết một ứng dụng mạng chóng ta cần phải cẩn thận khi sö dụng automatic flushing. Mỗi lần chóng ta flush làm sạch bộ đệm buffer thì một gói phải được khởi tạo và gửi đi. Trong trường hợp này, chính xác những gì chúng ta muốn, từ đó nếu gói tin chứa dòng dữ liệu không được gửi thì bắt tay trở lại và đến lần thứ 4 giữa server và client sẽ dừng. Thêm vào cách khác, kết thúc dòng là kết thúc lời nhắn. Nhưng trong nhiều trường hợp, lời nhắn không giới hạn bởi các dòng thì không dùng auto flushing và thay vào đó cho phép giải quyết phân chia buffer khi tạo và gửi một gói tin. Với cách này, các gói tin lớn có thể được gửi và xử lý nhanh hơn. Vòng while lặp vô tận để đọc các dòng từ StreamReader reader và ghi thông tin ra màn hình Console và đến StreamWriter writer. Chú ý reader và writer cũng giống như bất kỳ dòng tin nào, chúng chỉ được dùng để kết nối dòng tin trên mạng. Khi Client gửi dòng tin “END” thì chương trình sẽ ngưng vòng lặp, đóng TcpClient, và dừng TcpListener. Ví dụ sau đây sẽ tạo Client để kết nối với Server: using System; using System.Net; using System.Net.Sockets; using System.IO; public class JabberClient { private static readonly int PORT = 1711; public static void Main(string[] args){ IPAddress addr = IPAddress.Loopback; if (args.Length == 1) { addr = Dns.Resolve(args[0]).AddressList[0]; } Console.WriteLine("addr = " + addr.ToString()); TcpClient client = new TcpClient(); // Guard everything in a try-finally to make // sure that the socket is closed: try { Console.WriteLine("Client = " + client); client.Connect(addr, PORT); StreamReader reader = new StreamReader(client.GetStream()); StreamWriter writer = new StreamWriter(client.GetStream()); writer.AutoFlush = true; for (int i = 0; i < 10; i ++) { writer.WriteLine("howdy " + i); string str = reader.ReadLine(); Console.WriteLine(str); } writer.WriteLine("END"); } finally { Console.WriteLine("closing..."); client.Close(); } } } ///:~ Dns.Ressolve được dùng để lấy địa chỉ IPAddress. Nếu chương trình chạy với không tham số thì IPAddress được thiết lập là địa chỉ IP 127.0.0.1. TcpClient dùng phương thức TcpClient.Connect() để tạo kết nối với server, xử lý tạo kết nối NetworkStream vào trong StreamReader và StreamWriter được thực hiện cùng với server. Ở đây thuộc tính auto flushing được thiết lập bằng true. Mỗi dòng được gửi từ server được viết trở lại vào console. Client dùng dòng lệnh “END” để kết thúc kết nối. I.3. Server phôc vô nhiÒu clients Ở các ví dụ trên chúng ta đã thấy được sự dể dàng trong việc tạo một socket kết nối cũng như việc thao tác trên các dòng tin StreamNetwork giống như chúng ta đang thao tác trên các dòng tin vào ra bình thường khác. Phần tiếp theo đây chúng ta sẽ xem xÐt viÖc tạo ra một server cho phép cùng lúc nhận nhiều kết nối. Và câu trả lời cho vấn đề này là multithreading mà chúng ta đã xét trong phần trước. Trong các ngôn ngữ không hç trợ trực tiếp multithreading thì mọi việc trở nên rất phức tạp. Ở trong phÇn III chóng ta đã thấy sự đơn giản của multithreading. Bởi vì tiến trình trong C# được quản lý một cách hợp lý nên việc tạo ra một server để bắt tay với nhiều client một lúc không phải là khó. Lược đồ cơ bản là tạo ra một ServerSocket đơn trong server và gọi Accept() để chờ các kết nối mới. Khi Accept() trả về, bạn có được Socket và dùng nó để tạo ra các tiến trình mới làm việc với server giống những client riêng rẽ. Sau đó lai gọi Accept() để chờ đợi những kết nối mới. using System; using System.Net; using System.Net.Sockets; using System.IO; using System.Threading; public class MultiJabberServer { // Choose a port outside of the range 1-1024: public static readonly int PORT = 1711; public static void Main(){ new MultiJabberServer(); } public MultiJabberServer(){ TcpListener server = new TcpListener(PORT); try { server.Start(); Console.WriteLine("Started: " + server); while (true) { // Blocks until a connection occurs: TcpClient cnxn = server.AcceptTcpClient(); Console.WriteLine( "Connection accepted: "+ cnxn); new ServeOneJabber(cnxn); } } catch (Exception ex) { Console.WriteLine(ex); } finally { server.Stop(); } } } class ServeOneJabber { TcpClient cnxn; internal ServeOneJabber(TcpClient cnxn){ this.cnxn = cnxn; ThreadStart oneServer = new ThreadStart(Run); Thread svrThread = new Thread(oneServer); svrThread.Start(); } public void Run(){ try { StreamReader reader = new StreamReader(cnxn.GetStream()); StreamWriter writer = new StreamWriter(cnxn.GetStream()); writer.AutoFlush = true; Console.WriteLine("Beginning receive loop"); while (true) { String str = reader.ReadLine(); if (str == "END") break; Console.WriteLine("Echoing: " + str); writer.WriteLine(str); } } finally { cnxn.Close(); } } }///:~ MultiJabberServer() khởi tạo bắt đầu TcpListener và chờ đợi cho các kết nối được tạo ra. Khi kết nối được tạo ra, nó sẽ khởi tạo một đối tượng ServerOneJabber, qua đó TcpClient là đại diện cho kết nối mới. ServerOneJabber() khởi tạo chứa TcpClient cnxn là biến instance cùng tên. Tạo ra một ThreadStart đại diện và bắt đầu tiến trình mới Thread. Sự khởi tạo này thành công một cách nhanh chóng và cho phép MultiJabberServer tiếp tục lắng nghe chờ các yêu cầu kết nối khác. Phương thức ServerOneJabber.Run() là phương thức tạo một tiến trình đại diện và nó chứa đựng các nhận dạng đối với các JabberServer chỉ in ra màn hình console những gì gửi đến nó. Trách nhiệm đóng TcpClient không thuộc về MultiJabberServer mà chỉ khởi tạo nó. Đúng hơn là phương thức ServerOneJabber.Run() có sự phản hồi khi gọi TcpClient.Close() bên trong khối mệnh đề finally. Nên chú ý đến tính đơn giản của MultiJabberServer. Ngay trước khi một TcpListener được khởi tạo và AcceptTcpClient được gọi cho phép tạo ra một kết nối mới. Nhưng lúc nàygiá trị trả về (của TcpClient) được tạo ra từ sự khởi tạo của ServerOneJabber, cái mà tạo ra tiến trình mới và bắt tay kết nối. Khi kết nối kết thúc thì tiến trình này cũng bị hủy. II. Giao tiÕp víi Web II.1. Göi vµ nhËn c¸c yªu cÇu HTTP Tiếp theo chúng ta sẽ thảo luận về vấn đề rất hay, đó là việc tạo cũng như nhận các yêu cầu HTTP requests, chúng ta sẽ nói về lập trình World Wide Web. Như mäi ng­êi đã biết World Wide Web là cơ së của Hypertext Transport Protocol (HTTP). Tất nhiên, hầu hết các trình ứng dụng đều có kiểu HTTP request từ trình duyệt Web Browser, nhưng thật hữu ích nếu, đặc biệt là với mục đích gỡ lỗi thì chúng ta cần biết lập trình với HTTP Requests. .NET Framework SDK cung cấp các lớp để chúng ta thao tác một cách dể dàng, đó là lớp WebRequest và lớp HttpWebResquest trong không gian tên System.Net. Yêu cầu HTTP đơn giản nhất là gửi là gửi yêu cầu HTTP GET đến Uniform Resource Identifier riêng biệt. Và HTTP Server (Web Server) sẽ gửi thông tin phản hồi với một status code, một header, và một message body. Ví dụ sau thực hiện yêu cầu trên: using System; using System.Net; using System.IO; class HttpGet { public static void Main(string[] args){ HttpWebRequest req = (HttpWebRequest) WebRequest.Create(args[0]); Console.WriteLine("Created, but not connected"); HttpWebResponse res = (HttpWebResponse) req.GetResponse(); Console.WriteLine("Status: " + res.StatusCode); foreach(string key in res.Headers.Keys){ Console.WriteLine("Header[{0}]:{1}", key, res.Headers[key]); } Console.WriteLine("Contents:"); StreamReader rdr = new StreamReader( res.GetResponseStream()); Console.WriteLine(rdr.ReadToEnd()); } }///:~ Cách khởi tạo HttpWebRequest cũng giống như trong các ví dụ trước. Ta tạo ra một biến kiểu HttpWebRequest và cho nó trỏ đến đối tượng kiểu WebRequest. Một kiểu khác của WebRequest trong .NET Framework SDK là FileWebRequest, được khởi tạo bằng cách đưa vào tham số đối với WebRequest.Start() là “file://,” nhưng nếu bạn viết kiểu “ftp://” bạn có thể gọi phương thức tĩnh WebRequest.RegisterPrefix() và WebRequest.Create() sẽ trả về sau đó một WebRequest mới. Yêu cầu Request sẽ không mang tính thực tế chuyển tải trên mạng cho đến khi gọi WebRequest.GetResponse(). Bëi vì chúng ta biết rằng chúng ta đang phân chia yêu cầu bắt đầu với “http://”. Sau khi nhận về HttpWebRespone.StatusCode, sau đó chúng ta viết Http header vào Console. Tiêu đề header chính là thuộc tính HttpWebResponse.Header xuất phát từ đối tượng WebHeaderCollection là kiểu con của NameValueCollection. .NET Framework SDK được thiết kế có hổ trợ Microsoft’s Internet Information Server (IIS) và hầu hết các hình thức truy cập trực tiếp đều có hổ trợ giao diện IHttpHandler trong không gian tên System.Web. IHttpHandler định nghĩa hai thứ: một thuộc tính bool được gọi là IsReusable chỉ rõ đối tượng với khả năng bảo vệ Http Request. Khi đang viết một chương trình Web thành phần đòi hỏi trạng thái giảm đến mức tối đa server của bạn. Chính vì vậy nên thích hợp hơn khi bạn đặt thuộc tính này là true. Thành phần thức hai của IHttpHandler là phương thức IHttpHandler.ProcessRequest(), đây là phương thức tạo ra đối tượng HttpContext. Thuộc tính quan trọng nhất trong HttpContext là các đối tượng HttpRequest và HttpResponse (chú ý rằng các lớp này khác với các lớp mà được dùng tại client HttpWebRequest và HttpWebResponse). HttpRequest chứa một số lượng lớn các thuộc tính, hầu hết được dùng với thuộc tính HttpRequest.Form, trả về NameValueCollection với các định dạng tên biến và giá trị là kiểu string. II.2. C¸c yªu cÇu Web kh«ng ®ång bé Vấn đề không được thảo luận ở phần trước đó là phần giao diện của dòng tin .NET Framework IO stream có hổ trợ vào ra không đồng bộ, được gọi để đọc hoặc viết một dòng tin không phải là gói. Sự không đồng bộ trong IO sö dụng thiết kế không đồng bộ mà Microsoft chủ trương phát triển rộng trong sö dụng: đó là có một khai báo bắt đầu và kết thúc operation và kích hoạt kiểu đại diện không đồng bộ: public delegate void AsyncCallback(IAsyncResult ar); IasyncResult ar có một số trường chứa: Một Object AsyncState là một đối tượng domain phản chiếu bất kỳ trạng thái nào cần thiết cho hàm gọi ngược trở lại. WaitHandler AsyncWaitHandler có thể dùng đồng bộ nhiều tiến trình phức tạp trong các điều hành không đồng bộ. CompletedSynchronously and IsCompleted là hai thuộc tính kiểu bool xác định khi sự đồng bộ hóa begin operation hoàn thành và khi end operation kết thúc. Trong trường hợp WebRequest, sự đồng bộ hóa được gọi đến phương thức WebRequest.GetResponse() cùng phản hồi cùng lúc với phương thức bắt đầu begin và kết thúc end của WebRequest.BeginGetResponse( ), WebRequest.EndGetResponse( ). Để thiết lập một Web request thùc sự đồng bộ chóng ta nên dùng những phương thức này cho quá trình đọc không đồng bộ của các dòng Stream phản hồi dùng Stream.BeginRead() và Stream.EndRead(). II.3. DÞch vô Web WebServices không là các trình ứng dụng đứng đầu trong việc thức hiện vào ra để gửi với chuẩn Internet Protocol. Với “headless”, chúng ta hiểu rằng WebServices không có phần giao diện người dùng (tất nhiên giao diện người dùng cuối cùng thì cũng cần thiết, nhưng nó được thiết lập bởi một số thành phần khác chứ không phải WebServices. Thay vì các đối tượng hay các mã HTML (các thành phần giao diện), WebServices dùng tài liệu XML đối với việc vào và ra dữ liệu. Cách mà XML input tạo ra và XML output xóa như thế nào không phải là nội dung cần quan tâm của WebServices. Với “Standard Internet Protocols”, chúng ta có được nhiều khả năng thao tác. Khi mà WebServices trở thành từ thông dụng thì các biến tự động hoàn thành bằng cách nhìn vào danh sách các đặc điểm của chúng và nói rằng “Nếu không hổ trợ giao thức này thì không thể hoàn thành được” hay là “Giao thức này thật là thiết kế mỡ rộng để giải quyết vấn đề của chúng ta”. Theo hướng đó có nhiều chuẩn đối lập nhau đối với bản chất của các chức năng, bao gồm ý nghĩa các thủ tục của thủ tục được gọi và ý nghĩa mà WebServices mô tả. Cấu trúc chính là các quyết định bình phẩm đối với WebServices nhưng .NET vẫn kiên quyết theo phía của Simple Object Access Protocol (SOAP). Sau đây là một ví dụ đơn giản của WebServices : chương trình “Hello,C#” được kết hợp với WebMethodAttribute. Như là một thành phần của trình biên dịch, Visual Studio .NET nhận ra thuộc tính này và tự động đưa lên IIS qua dịch vụ SOAP. IIS điều đầu cuối của URI thông qua file .asmx với các công cụ của WebServices. File này phải có dòng khai báo WebServices riêng ở đầu, nhưng hơn hết là sau đó thì các thuộc tính được hoàn toàn. Ví dụ này sẽ trả về thời gian time của server hiện tại: using System; using System.Web.Services; [WebService(Namespace="")] class WhatsTheTime{ [WebMethod] public DateTime Time(){ return DateTime.Now; } }///:~ File được save dưới dạng Xxx.asmx, nó phải được thêm vào khai báo , phương thức được khai báo dạng public và kết hợp với WebMethodAttribute và server của bạn phải cài nền .NET Framework. IIS cung cấp một dịch vụ được mô tả trong Web Services Description Language (WSDL). Khi bạn khai báo : Thì phương thức WebMethodAttribute trong kiểu Type sẽ được load từ Asssemble trong thư mục con /bin. Khi bạn dùng Visual Studio .NET để tạo một WebServices Project thì kiểu của WebServices phải được khai báo. Khối trong khai báo trang ASP.NET. Cũng giống như ADO.NET hay XML thì trang ASP.NET cũng là một công nghệ được tạo nên với C#, nhưng nó không phải là một tập con ASP.NET được biên dịch thành khối các mã lệnh HTML (giống WebServices đã khai báo ở trên). Chúng ta không nói nhiều về ASP.NET ở đây mà sẽ trình bày về nó trong tài liệu khác. PhÇn VI: Mét vµi so s¸nh C# víi c¸c ng«n ng÷ kh¸c Trong phÇn nµy, chóng em sÏ ®­a ra mét vµi so s¸nh theo suy nghÜ c¸ nh©n nh»m ®­a ra nh÷ng sù kh¸c biÖt cña C# víi c¸c ng«n ng÷ kh¸c. C#, C++, Java cã thÓ coi nh­ cã chung mét nguån gèc ®ã lµ lo¹i ng«n ng÷ lËp tr×nh h­íng ®èi t­îng nªn chóng cã ®é t­¬ng ®ång víi nhau h¬n lµ t­¬ng ®ång víi c¸c ng«n ng÷ kh¸c. VB cã thÓ coi lµ Ýt t­¬ng ®ång nhÊt víi C#. I. Sù kh¸c nhau gi÷a C# vµ C/C++ M· cña C# rÊt quen thuéc víi nh÷ng ng­êi ®· lËp tr×nh C vµ C++, tuy nhiªn vÉn cã mét vµi kh¸c biÖt. I.1. VÒ m«i tr­êng C# ch¹y trªn m«i tr­êng lµ nÒn .NET, ®iÒu nµy cã nghÜa lµ cã nhiÒu thø ®­îc thùc hiÖn tù ®éng, kh«ng cÇn sù ®iÒu khiÓn cña ng­êi lËp tr×nh, cô thÓ nh­ sau: ViÖc xo¸ bá c¸c ®èi t­îng ®­îc thùc hiÖn tù ®éng bëi GC khi kh«ng cßn bé nhí ®Ó cÊp ph¸t. GC còng cã thÓ gäi ®Ó thùc hiÖn thu håi bé nhí trong nh÷ng tr­êng hîp c¸ biÖt. Trong khi ®ã, ng­êi lËp tr×nh C++ lu«n ph¶i ®¶m nhiÖm viÖc qu¶n lÝ bé nhí. Hoµn toµn kh«ng cã kiÓu con trá trong ng«n ng÷ C#. Thay vµo ®ã lµ kiÓu d÷ liÖu tham trÞ, cã thÓ ho¹t ®éng nh­ con trá nh­ng dÔ dµng h¬n. M· nguån C# ®­îc dÞch ra ng«n ng÷ trung gian IL, trong khi m· nguån C++ ®­îc dÞch ra m· m¸y nªn kh«ng ®éc lËp víi nÒn nh­ C#. C¸c thµnh phÇn cña mét øng dông ®­îc ®ãng gãi trong mét assembly cïng víi c¸c th«ng tin metadata vÒ øng dông, nã cho phÐp CLR n¹p ®ñ c¸c thµnh phÇn cña mét øng dông C# vµo ch¹y. §èi víi C++, c¸c thµnh phÇn chØ ®­îc ®Þnh nghÜa láng lÎo trong c¸c file .h, tuy nhiªn viÖc mÊt m¸t c¸c file .h còng rÊt hay x¶y ra, khi ®ã kh«ng dÞch ®­îc ch­¬ng tr×nh C++. Kh¸c biÖt trªn ®· chøng tá mét ®iÒu: mét khi øng dông C# ®· ch¹y th× nã lu«n ch¹y. ViÖc ®­a mét øng dông C# vµo thùc thi cÇn nhiÒu thao t¸c h¬n øng dông C++ nªn cÇn nhiÒu thêi gian h¬n, khã phï hîp víi c¸c m¸y cã cÊu h×nh thÊp. Ch­¬ng tr×nh C# cã kh¶ n¨ng b¾t c¸c lçi runtime vµ xö lÝ h¬n lµ chØ tr¶ vÒ m· lçi nh­ C/C++. I.2. VÒ c¸c lÖnh C¸c c©u lÖnh cña C# rÊt gièng víi C/C++, tuy nhiªn còng cã thÓ kÓ ra mét sè kh¸c biÖt: Tõ kho¸ new cã nghÜa lµ t¹o ra mét b¶n copy cña mét kiÓu d÷ liÖu hay ®èi t­îng. §èi t­îng sÏ ®­îc cÊp ph¸t ë vïng heap nÒu nã lµ kiÓu tham biÕn, cÊp ph¸t ë vïng stack nÕu lµ kiÓu tham trÞ. TÊt c¶ c¸c c©u lÖnh liªn quan ®Õn kiÓm tra l« - gÝc ®Òu cÇn mét biÕn kiÓu boolean vµ kh«ng thÓ chuyÓn kiÓu tõ boolean sang int hay ng­îc l¹i. C# cã thªm c©u lÖnh foreach nh»m liÖt kª c¸c thµnh phÇn trong mét tËp hîp ®Ó thùc hiÖn phÐp lÆp. C¸c tõ kho¸ checked vµ unchecked trong C# ®­îc sö dông ®Ó kiÓm tra xem nh÷ng thao t¸c sè häc cã bÞ trµn sè hay kh«ng. §Þnh nghÜa l¹i phÐp g¸n kh«ng ®­îc khuyÕn khÝch trong C#. I.3. VÒ tæ chøc ch­¬ng tr×nh C# kh«ng cã c¸c file header, tÊt c¶ c¸c m· ®Òu ph¶i viÕt trong mét líp hay ®¬n vÞ t­¬ng ®­¬ng vµ thuéc vÒ líp ®ã. C# kh«ng yªu cÇu thø tù khai b¸o, ®Þnh nghÜa c¸c biÕn, c¸c líp. Tuy nhiªn trong C# còng kh«ng cã mét sè tÝnh n¨ng thuËn tiÖn cã trong C++: §a thõa kÕ hµm h»ng, to¸n tö ph¹m vi, tham biÕn h»ng, tham biÕn ngÇm ®Þnh. Khëi t¹o sao chÐp Define Typedef II. Sù kh¸c biÖt gi÷a C# vµ Java C# vµ Java ®Òu lµ nh÷ng ng«n ng÷ hoµn toµn h­íng ®èi t­îng nªn ch¾c ch¾n chóng ph¶i cã nhiÒu ®iÓm gièng nhau, tuy nhiªn còng cã t­íng øng nh÷ng ®iÓm kh¸c nhau. Kh¸c nhau râ nhÊt lµ kh¸c biÖt vÒ nÒn. C# ch¹y trªn nÒn .NET. cßn Java ch¹y trªn nÒn m¸y ¶o Java. II.1. VÒ kiÓu d÷ liÖu C# cã nhiÒu kiÓu d÷ liÖu nguyªn thuû h¬n Java. B¶ng sau ®©y sÏ tæng kÕt c¸c kiÓu trong Java vµ c¸c kiÓu t­¬ng øng trong C#. Trong Java, c¸c kiÓu nguyªn thuû ®­îc ph©n t¸ch theo c¸c líp lèt ( wrapper class) cña nã, vÝ dô : kiÓu integer thuéc vÒ líp Int. Tuy nhiªn trong C#, nh÷ng kiÓu nguyªn thuû còng ®Òu ®­îc kÕ thõa tõ líp object, cã nghÜa lµ kiÓu int còng t­¬ng ®­¬ng víi líp Int. Do vËy mµ trong C# cã thÓ viÕt nh­ sau : Console.WriteLine(5.ToString()); 5 ë ®©y lµ mét h»ng sè nguyªn nh­ng còng ®­îc coi lµ mét ®èi t­îng Int. NÕu viÕt nh­ vËy trong Java sÏ cã lçi, trong Java ph¶i viÕt nh­ sau: Console.WriteLine(Integer.toString(5)); B¶ng so s¸nh c¸c kiÓu d÷ liÖu gi÷a Java vµ C#: Java vµ C# ®Òu gåm 2 lo¹i kiÓu d÷ liÖu tham trÞ vµ tham biÕn. Tuy nhiªn trong C# hç trî kiÓu struct thuéc lo¹i tham trÞ cßn Java th× kh«ng. Do ®ã, trong C# chóng ta cã thÓ ®Þnh nghÜa thªm c¸c kiÓu tham trÞ, cßn Java th× chØ cã c¸c kiÓu tham trÞ s½n cã, c¸c kiÓu d÷ liÖu ng­êi dïng ®Þnh nghÜa ra ®Òu lµ kiÓu tham biÕn hay ®èi t­îng th«ng qua ®Þnh nghÜa líp. II.2. VÒ truy cËp thµnh phÇn Ngoµi c¸c thuéc tÝnh truy cËp nh­ public, private, protected, C# cßn thªm vµo thuéc tÝnh internal. Nh÷ng thµnh phÇn cã thuéc tÝnh Internal sÏ ®­îc truy cËp tõ nh÷ng líp kh¸c trong cïng mét project hay chÝnh x¸c h¬n lµ trong cïng mét assembly. II.3. C¸c tham sè ref vµ out Trong Java, c¸c kiÓu d÷ liÖu tham trÞ th× lu«n ®­îc truyÒn theo kiÓu tham trÞ trong lêi gäi hµm. Tuy nhiªn, trong C# vÉn cho phÐp c¸c kiÓu tham trÞ truyÒn theo kiÓu tham biÕn trong lêi gäi hµm b»ng khai b¸o tõ kho¸ ref ®øng tr­íc tham sè. Tõ kho¸ out còng cã chøc n¨ng nh­ tõ kho¸ ref, tuy nhiªn tham sè dïng víi tõ kho¸ out kh«ng cÇn ph¶i khëi t¹o gi¸ trÞ tr­íc khi gäi. II.4. Giao diÖn (Interfaces) Interface trong Java cã thÓ cã h»ng sè cßn trong C# th× kh«ng. Khi thùc thi mét Interface, C# còng cÊp lêi gäi t­êng minh thùc thi Interface. §iÒu nµy cho phÐp mét class thùc thi 2 Interface tõ 2 nguån kh¸c nhau cã cïng tªn c¸c thµnh phÇn ( vÊn ®Ò nµy ®· tõng ®­îc coi nh­ gãc tèi t¨m nhÊt cña C++ trong thùc hiÖn thõa kÕ , dÉn theo s¸ch “LËp tr×nh C++” cña Ng« Trung ViÖt). II.5. VÒ 2 tõ kho¸ khai b¸o import vµ using Trong Java khai b¸o import dïng ®Ó ®Þnh vÞ mét gãi th­ viÖn vµo ch­¬ng tr×nh nh­ kiÓu th­ viÖn.Trong C#, tõ kho¸ using dïng ®Ó b¸o hiÖu cho ch­¬ng tr×nh dÞch cã sö dông th­ viÖn ®ã vµ ghi vµo trong assembly, cßn th­ viÖn ®ã ë d¹ng th­ viÖn ®éng, sÏ ®­îc load vµo ch­¬ng tr×nh bëi CLR sau khi ®äc metadata lóc thùc hiÖn ch­¬ng tr×nh. Tuy nhiªn, trong C# cã mét thiÕu sãt mµ ®©y l¹i lµ ®iÓm m¹nh cña Java ®ã lµ c¸c applet. Applet thùc sù lµ mét øng dông trªn Web, nã ®­îc viÕt tõ mét n¬i nµo ®ã nh­ng l¹i cã thÓ ch¹y trªn mét m¸y kh¸ch bÊt k×, lµm gi¶m thêi gian truyÒn trªn m¹ng nh­ng l¹i thùc hiÖn ®­îc nhiÒu c«ng viÖc phøc t¹p nh­ xö lÝ ©m thanh, h×nh ¶nh, ®a luång ngay trªn mét trang Web. Tuy nhiªn nã l¹i kh«ng an toµn. Applet ®ã cã thÓ lÊy c¾p c¸c th«ng tin trªn m¸y kh¸ch råi truyÒn ®i. Do ®ã, C# ®· kh«ng hç trî Applet, thay vµo vµo ®ã lµ øng dông Web kiÓu míi dùa trªn c«ng nghÖ ASP, tÊt c¶ c¸c øng dông ®Òu ®­îc ch¹y trªn server, c¸c trang Web chØ ®ãng voi trß giao tiÕp víi ng­êi dïng mµ th«i. Ngoµi ra trong Java, tÊt c¶ c¸c c«ng viÖc kh«ng ch¾c kh«ng cã lçi nh­ vµo ra, ®éc file… th× ph¶i dïng cÆp try – catch ®Ó b¾t lçi. Trong C# kh«ng b¾t buéc lËp tr×nh viªn ph¶i thùc hiÖn try – catch ë bÊt k× t×nh huèng nµo. §iÒu nµy cã nghÜa lµ, ng­êi lËp tr×nh C# ph¶i cÈn thËn h¬n trong lËp tr×nh. III. Sù kh¸c biÖt gi÷a C# vµ VB 6.0 VB 6.0 vµ C# thuéc hai kiÓu ng«n ng÷ kh¸c nhau. VB 6.0 lµ lËp tr×nh h­íng sù kiÖn, chØ cã mét Ýt tÝnh chÊt lËp tr×nh híng ®èi t­îng trong khi C# hoµn toµn h­íng ®èi t­îng. Do ®ã, VB vµ C# kh¸c nhau gÇn nh­ hoµn toµn. RÊt khã t×m ®­îc sù t­¬ng ®ång nµo gi÷a C# vµ VB. Vb chØ phï hîp cho c¸c dù ¸n dùa trªn Windows nhá, nhanh. Nãi chung ®Þnh d¹ng ng«n ng÷ C# ®¬n gi¶n cßn VB 6.0 rÊt r­êm rµ. VB vÉn tån t¹i cÆp Begin – End, For- to, trong khi C# ®· d¬n gi¶n ®i nhiÒu, ngay c¶ For each trong C# th× trong VB ph¶i cã c¸ch trèng gi÷a For vµ each. §iÒu nµy lµm gi¶m n¨ng suÊt lËp tr×nh rÊt mhiÒu. VB còng nh­ C++, kh«ng cã mét nÒn t¸ch biÖt víi hÖ ®iÒu hµnh, ch¹y th¼ng trªn Windows, sö dông th­ viÖn cña Windows nªn rÊt phô thuéc m¸y. HÖ thèng th­ viÖn cña VB th× nhá, th­êng kh«ng ®¸p øng nh÷ng nhu cÇu ngµy cµng t¨ng cña ng­êi lËp tr×nh. VÒ kiÓu d÷ liÖu, do VB kh«ng ph¶i lµ h­íng ®èi t­îng nªn kh¸c hoµn toµn víi kiÓu d÷ liÖu trong C#, kiÓu d÷ liÖu trong VB vÉn thiªn vÒ nh÷ng ng«n ng÷ phi ®èi t­îng tr­íc ®©y nh­ Pascal. Nãi tãm l¹i, C# hoµn toµn v­ît tréi so víi VB. KÕt luËn Trong suèt b¶n b¸o c¸o nµy, chóng em ®· tr×nh bµy mét vµi ®Æc ®iÓm còng nh­ kh¶ n¨ng cña C#, cô thÓ lµ c¸c ®Æc ®iÓm vÒ hÖ thèng nÒn .NET cïng víi ng«n ng÷ C#, c¸c kh¶ n¨ng cña C# trong c¸c lÜnh vùc ®å ho¹, thùc hiÖn tÝnh to¸n song song, lËp tr×nh m¹ng. Chóng em c÷ng ®· ®­a ra mét vµi so s¸nh, nhËn xÐt vÒ C# trong sù t­¬ng quan víi c¸c ng«n ng÷ kh¸c. Cã thÓ thÊy r»ng, C# lµ ng«n ng÷ hiÖn ®¹i, ®¬n gi¶n, song cã kh¶ n¨ng cao trong viÖc ph¸t triÓn c¸c dù ¸n phÇn mÒm. C# cã ®Çy ®ñ c¸c tÝnh n¨ng tèt cña c¸c ng«n ng÷ tr­íc ®ã ®ång thêi h¹n chÕ ®i nhiÒu lçi mµ c¸c ng«n ng÷ tr­íc m¾c ph¶i. C# míi ra ®êi ®­îc 3 n¨m, nã lµ ng«n ng÷ cßn ®ang trong giai ®o¹n ph¸t triÓn ®Ó hoµn thiÖn, vµo ®iÓm nµy, khã cã thÓ ®¸nh gi¸ toµn bé c¸c ­u nh­îc ®iÓm cña C#. Trong t­¬ng lai, C# cã lÏ sÏ trë thµnh ng«n ng÷ lËp tr×nh th«ng dông nhÊt. Chóng em xin kÕt thóc ®Ò tµi t¹i ®©y. Chóng em xin ch©n thµnh c¶m ¬n thµy gi¸o NguyÔn Ngäc B×nh ®· h­íng dÉn chóng em tiÕp cËn vµ thùc hiÖn ®Ò tµi nµy. Tµi liÖu tham kh¶o [1] Anders Hejlsberg, Scott Wiltamuth; C# Language Reference; Microsoft press [2] Adrian Turtschi; C# . N ET Developer’s Guide; Syngress [3] Eric Gunnerson; A Programmer's Introduction to C#; Apress [4] Evangelos Petroutsos; Mastering Visual Basic .Net Multithreading Tutorial; Sybex [5] Jesse Liberty; Programming C#; O'Reilly [6] Larry O’Brien, Bruce Eckel; Thingking in C#; Prentice Hall [7] MSDN Library; Microsoft press [8] Ng« Trung ViÖt; H­íng dÉn lËp tr×nh C++; NXB Giao Th«ng VËn T¶i [9] Paul Deitel; Tù häc ng«n ng÷ lËp tr×nh Java; NXB Thèng Kª [10] R. Allen Wyke; XML programming; Microsoft press Phô lôc I. M« t¶ ch­¬ng tr×nh minh häa Ch­¬ng tr×nh nµy cã nhiÖm vô t×m kiÕm mét thuËt ng÷ ( t×m kiÕm chÝnh x¸c) trong mét Website nhÊt ®Þnh. Nh÷ng nhiÖm vô cô thÓ cña ch­¬ng tr×nh: Ng­êi dïng nhËp chÝnh x¸c mét thuËt ng÷ vµ mét ®Þa chØ Website cÇn t×m Ch­¬ng tr×nh tr¶ vÒ nh÷ng trang trong Web site vµ sè lÇn xuÊt hiÖn, chóng sÏ ®­îc hiÓn thÞ lªn mµn h×nh Ch­¬ng tr×nh cã thÓ x¾p xÕp gi¶m dÇn sè lÇn xuÊt hiÖn cña thuËt ng÷ trong tõng trang Web §Ó cµi ®Æt mét øng dông cã ®Çy ®ñ c¸c phÇn ®· t×m hiÓu trong b¸o c¸o rÊt phøc t¹p, chóng em chän cµi ®Æt øng dông nµy v× nã thÓ hiÖn c¸c yÕu tè: lËp tr×nh øng dông cã giao diÖn ®å ho¹ trªn Windows, cã giao tiÕp víi Internet, cã sö dông kÜ thuËt ®a luång. Ch­¬ng tr×nh gåm c¸c líp sau: Search Text Engine docfetcher docparser lister Search Engine Search Image Engine Líp lister: giao diÖn víi ng­êi sö dông Líp docparser: ph©n tÝch, tßm kiÕm th«ng tin trang Web Líp docfetcher: lÊy th«ng tin Web pages tõ Internet Ho¹t ®éng cña ch­¬ng tr×nh: Lister nhận thuật ngữ , địa chỉ Website , truyền cho Docparser Docparser truyền địa chỉ Website cho Docfetcher Docfetcher nhận địa chỉ Website , lấy thông tin từ Internet trả về cho Docparser Docparser tìm kiếm , trả về địa chỉ Webpage cho lister, Docparser lấy các link trong trang trýớc rồi lặp lại quá trình tr­íc CÊu tróc d÷ liÖu cña ch­¬ng tr×nh: Giai ®o¹n t×m kiÕm vµ hiÓn thÞ buéc ph¶i tiÕn hµnh song song v× d÷ liÖu tõ mét Website rÊt lín, khã t×m hÕt trong thêi gian ng¾n, ng­êi dïng l¹i muèn nh×n thÊy kÕt qu¶ ngay, nªn 2 viÖc nµy ph¶i tiÕn hµnh ®ång thêi. Ch­¬ng tr×nh sö dông 2 luång, luång 1 chÞu tr¸ch nhiÖm t×m kiÕm, ph©n tÝch th«ng tin tõ Website, ®­a ®Þa chØ trang Web cïng sè lÇn thuËt ng÷ xuÊt hiÖn vµo mét hµng, luång 2 chÞu tr¸ch nhiÖm vµo hµng lÊy ®Þa chØ trang Web cïng s« lÇn xuÊt hiÖn ra hiÓn thÞ. Ch­¬ng tr×nh cã sö dông mét gi¶i thuËt t×m kiÕm nhanh ®Ó t×m kiÕm thuËt ng÷ còng nh­ link trong trang Web. Qu¸ tr×nh duyÖt link trong trang Web sö dông qu¸ tr×nh duyÖt theo chiÒu réng. II. H­íng dÉn sö dông ch­¬ng tr×nh §Ó sö dông ch­¬ng tr×nh nµy, ng­êi dông nhËp thuËt ng÷ cÇn t×m vµo « Input a key word, thuËt ng÷ ph¶i nhËp chÝnh x¸c, kh«ng thõa c¸c kÝ tù c¸ch trèng. §èi víi tiÕng ViÖt , ng­êi dïng cã thÓ sö dông bé gâ VietKey ®Ó gâ tiÕng ViÖt Unicode, hoÆc gâ trùc tiÕp ( ch­¬ng tr×nh ®· tÝch hîp s½n bé gâ Unicode theo d¹ng Telex) vÝ dô: - §Ó nhËp ViÖt Nam sÏ gâ nh­ sau: Vieejt Nam - §Ó nhËp Tæ Quèc sÏ gâ nh­ sau: Toor Quoosc Sau khi nhËp xong thuËt ng÷ , ng­êi dïng nhËp ®Þa chØ Website cÇn t×m: cÇn nhËp ®ñ nh­ sau: [®Þa chØ cô thÓ] [ ….] : phÇn tuú chän VÝ dô: NÕu b¹n nhËp kh«ng ®ñ, nhËp sai hai phÇn trªn ch­¬ng tr×nh kh«ng ch¹y hay ch¹y kh«ng chÝnh x¸c, sau khi nhËp xong, kÝch vµo nót SEARCHING WITH GOOGLE, ch­¬ng tr×nh b¾t ®Çu t×m kiÕm. Thanh StatusBar ë cuèi mµn h×nh hiÖn trang ®ang t×m kiÕm. NÕu t×m thÊy mét trang cã thuËt ng÷, ch­¬ng tr×nh sÏ hiÓn thÞ lªn mµn h×nh cung víi sè lÇn xuÊt hiÖn thuËt ng÷. NÕn muèn xem trang ®ã, ng­êi dïng chØ cÇn kÝch chuét vµo phÇn ®Þa chØ trang. NÕu nh­ ng­êi dïng thÊy kh«ng cÇn t×m n÷a th× kÝch vµo nót “ ENOUGH FOR ME” , ch­¬ng tr×nh sÏ kÕt thóc t×m kiÕm NÕu ng­êi dïng muèn x¾p xÕp c¸c trang theo thø tù tÇn xuÊt xuÊt hiÖn thuËt ng÷ gi¶m dÉn th× kÝch vµo nót “PLEASE ARRANGE” Trong khi ch¹y ch­¬ng tr×nh, nÕu ng­êi sö dông thay ®æi néi dung c¸c hét nhËp, hay kÝch vµo nót SEARCHING WITH GOOGLE th× ch­¬ng tr×nh sÏ kÕt thóc hay t×m l¹i tõ ®Çu III. H­íng dÉn cµi ®Æt ch­¬ng tr×nh ViÖc cµi ®Æt ch­¬ng tr×nh vµ ch¹y ch­¬ng tr×nh kh«ng cã g× phøc t¹p. Mäi ng­êi vµo th­ môc RUN trªn ®Üa CD. Ch­¬ng tr×nh ph¶i ch¹y trªn nÒn .NetFramework. NÕu m¸y tÝnh cña b¹n ®· cã cµi nÒn .NetFramework th× kh«ng ph¶i cµi .NetFramework n÷a vµ bá qua b­íc nµy, nÕu ch­a th× c¸c b¹n vµo th­ môc Microsoft .NetFramework, ch¹y file dotnetfx ®Ó cµi ®Æt nÒn .NetFramework. Sau khi ®· cµi ®Æt xong .NetFramework , b¹n tiÕn hµnh cµi ®Æt ch­¬ng tr×nh ®å ¸n. C¸c b¹n vµo th­ môc: “Bai tap lon huong doi tuong”, ch¹y file cµi ®Æt “CaiDatBaitaplonB5_tin2” hay ch¹y file cµi ®Æt Setup. Ch­¬ng tr×nh cµi ®Æt sÏ h­íng dÉn b¹n thùc hiÖn c¸c b­íc cßn l¹i ®Ó thùc hiÖn cµi ®Æt ch­¬ng tr×nh Sau khi cµi ®Æt ch­¬ng tr×nh, file ch¹y cña ch­¬ng tr×nh lµ file BaitaplonB5_tin2.exe , file nµy sÏ xuÊt hiÖn trªn mµn h×nh Desktop cña m¸y cña ban, trong menu Start -> Program, ë th­ môc mµ b¹n ®· chän khi cµi ®Æt ch­¬ng tr×nh. B¹n ch¹y ch­¬ng tr×nh BaitaplonB5_tin2.exe vµ sö dông ch­¬ng tr×nh.

Các file đính kèm theo tài liệu này:

  • docP0002.doc