Mã hóa và giải mã trong C#

Trong khi lập trình ứng dụng, ở các form đăng nhập, khi cần nhập mật khẩu, chúng ta thường phải truy xuất vào CSDL để lấy ra mật khẩu. Nhưng để bảo mật, mật khẩu này đã được mã hóa từ trước rồi. Để mã hóa được chuỗi mật khẩu, ta dùng hàm Encrypt sau:
public string Encrypt(string toEncrypt, bool useHashing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);
            if (useHashing)
            {
                var hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(Encoding.UTF8.GetBytes("iloveit1208"));
            }
            else keyArray = Encoding.UTF8.GetBytes("iloveit1208");
            var tdes = new TripleDESCryptoServiceProvider
                           {
                               Key = keyArray,
                               Mode = CipherMode.ECB,
                               Padding = PaddingMode.PKCS7
                           };
            ICryptoTransform cTransform = tdes.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }

Để giải mã chuỗi đã được mã hóa, ta dùng hàm Decrypt sau:
public string Decrypt(string toDecrypt, bool useHashing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
            if (useHashing)
            {
                var hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(Encoding.UTF8.GetBytes("iloveit1208"));
            }
            else keyArray = Encoding.UTF8.GetBytes("iloveit1208");
            var tdes = new TripleDESCryptoServiceProvider
                           {
                               Key = keyArray,
                               Mode = CipherMode.ECB,
                               Padding = PaddingMode.PKCS7
                           };
            ICryptoTransform cTransform = tdes.CreateDecryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            return Encoding.UTF8.GetString(resultArray);
        }

Ví dụ cách sử dung:
string s=”Chao mung cac ban den boi blog cua iloveit1208”;
string mahoa=Encrypt(s,true);
string giaima=Decrypt(mahoa,true);
Chúc các bạn thành công!

Kết nối C# với MySQL

Bạn có thể lập trình VC# (hay VJ#, VB .Net) truy xuất database MySQL bằng cách dùng 1 trong 4 giao tiếp lập trình sau: ODBC .Net, MySQL Provider, OLEDB .Net, thư viện lập trình API.
1. ODBC .Net: đây là giao tiếp chuẩn hóa nên có tính tổng quát hóa cao nhất, bạn truy xuất database của MySQL và của các hệ quản trị CSDL khác thông qua các đối tượng chuẩn của Microsoft (trong namespace System.Data.Odbc).
2. MySQL Provider đặc dụng, thí dụ như MySQLDirect, phương pháp này cũng giống như phương pháp 1, chỉ có điều là bạn phải cài và sử dụng các đối tượng đặc dụng của 1 hãng khác chứ không dùng các đối tượng ODBC chuẩn của Microsoft.
3. OLEDB .Net, phương pháp này rất giống như phương pháp 1, chỉ khác là thay vì dùng các đối tượng ODBC .Net, bạn sẽ dùng các đối tượng OLEDB .Net. Mặc dù các đối tượng OLEDB .Net cũng do Microsoft cung cấp, nhưng Microsoft khuyến cáo họ sẽ không hỗ trợ các đối tượng OLEDB .Net nữa.
4. Thư viện lập trình API đặc dụng bằng C++, thí dụ như thư viện mysqlclient. Đây là phương pháp có tính tổng quát hóa thấp nhất, vì đoạn lệnh truy xuất database trong ứng dụng chứa rất nhiều lệnh gọi hàm API của thư viện đặc dụng.
Tóm lại trong 4 phương pháp trên, chỉ có phương pháp 1 là tổng quát nhất, do đó bạn nên lập trình dùng phương pháp này để truy xuất database MySQL. Thí dụ hàm Testdb() sau đây cho phép tạo 1 table mới trên database 'test' do MySQL server chạy trên máy 'NgocDV' quản lý, hàm này dùng các đối tượng ODBC .Net sau: OdbcConnection, OdbcCommand, OdbcDataReader.
using Console = System.Console;
using System.Data.Odbc;
        private void Testdb() {
        try{
                //Connection string dùng DSN và MyODBC 3.51
                string MyConString = "DSN=MySQL";
                //hoặc Connection string dùng trực tiếp Provider MyODBC 3.51
                /*string MyConString = "DRIVER={MySQL ODBC 3.51 Driver};" +
                "SERVER=NgocDV;" +
                "DATABASE=test;" +
                "UID=zensoft;" +
                "PASSWORD=nssh;" +
                "OPTION=3";
                */
                //tạo connection tới database
                OdbcConnection MyConnection = new OdbcConnection(MyConString);
                MyConnection.Open();
                //xóa table testdb nếu đã có rồi
                OdbcCommand MyCommand = new OdbcCommand("DROP TABLE IF EXISTS testdb",MyConnection);
                MyCommand.ExecuteNonQuery();
                //Tạo lại table testdb có 3 field
                MyCommand.CommandText = "CREATE TABLE testdb(hoten varchar(40),namsinh int, diachi varchar(50))";
                MyCommand.ExecuteNonQuery();
                //Thử thêm 1 record dữ liệu
                MyCommand.CommandText = "INSERT INTO testdb VALUES('Dao Van Ngoc',1983,'An Dong, An Duong, HP')";
                MyCommand.ExecuteNonQuery();
                //Thử thêm 1 record dữ liệu nữa
                MyCommand.CommandText = "INSERT INTO testdb VALUES('Duong Thu Son',1983,'Trai Chuoi, Hong bang, Hp')";
                MyCommand.ExecuteNonQuery();
                //Thử thêm 1 record dữ liệu nữa
                MyCommand.CommandText = "INSERT INTO testdb VALUES('Pham Tuan Hai',1985,'294 Tran Nguyen Han, HP')";
                MyCommand.ExecuteNonQuery();
                //Thử thêm 1 record dữ liệu nữa
                MyCommand.CommandText = "INSERT INTO testdb VALUES('Nguyen Ha Son',1985,'10/10 Lạch tray, HP')";
                MyCommand.ExecuteNonQuery();
                //Hiệu chỉnh thử 1 field của 1 số record thỏa điều kiện
                MyCommand.CommandText = "UPDATE testdb SET namsinh=1984 WHERE namsinh=1985";
                MyCommand.ExecuteNonQuery();
                //Đếm số record hiện có
                MyCommand.CommandText = "SELECT COUNT(*) as TRows FROM testdb";
                Console.WriteLine("Total Rows: " + MyCommand.ExecuteScalar());
                //Duyệt đọc và hiển thị các record trong table
                MyCommand.CommandText = "SELECT * FROM testdb";
                OdbcDataReader MyDataReader;
                MyDataReader = MyCommand.ExecuteReader();
                while (MyDataReader.Read()) {
                        Console.WriteLine("Data: " + MyDataReader.GetString(0) + ", " +
                        MyDataReader.GetInt32(1) + ", " +
                        MyDataReader.GetString(2)); //BIGINTs not supported by MyODBC
                }
                //Đóng các đối tượng đã dùng
                MyDataReader.Close();
                MyConnection.Close();
        }
        catch (OdbcException MyOdbcException) {//Catch tất cả lỗi exception
        for (int i=0; i < MyOdbcException.Errors.Count; i++) {
        Console.Write("ERROR #" + i + "\n" + "Message: " +
        MyOdbcException.Errors[i].Message + "\n" + "Native: " +
        MyOdbcException.Errors[i].NativeError.ToString() + "\n" +
        "Source: " + MyOdbcException.Errors[i].Source + "\n" +
        "SQL: " + MyOdbcException.Errors[i].SQLState + "\n");
        }
}
}
Một số lưu ý khi lập trình dùng ODBC .Net:
1. Cài đặt MySQL Server trên máy nào đó và lưu ý tên (địa chỉ) của máy đó. Nhớ cấu hình cho MySQL Server sử dụng ít nhất protocol TCP/IP để giao tiếp với các máy client.
2. Download "MySQL ODBC 3.51 Driver" và cài đặt nó trên máy client (máy sẽ chạy ứng dụng do bạn viết). Bạn có thể download "MySQL ODBC 3.51 Driver" ở địa chỉ http://dev.mysql.com/downloads/connector/odbc/3.51.html.
3. Nếu lập trình dùng DSN trong connection string để nối kết với MySQL Server, bạn phải tạo trước DSN kết hợp với database cần truy xuất. Bạn hãy chạy Control Panel.Administrative Tools.Data Source (ODBC) để tạo DSN kết hợp với database cần truy xuất.
4. Nếu lập trình dùng DSN trong connection string thì đoạn lệnh mà bạn viết hoàn toàn độc lập với công nghệ quản lý database, vị trí vật lý database. Cụ thể hàm Testdb() mà chúng tôi viết ở trên hoàn toàn độc lập với công nghệ quản lý database và vị trí vật lý của database, nó có thể truy xuất bất kỳ database nào của hệ quản trị database nào, bạn chỉ cần vào tool Data Source (ODBC) của Windows và hiệu chỉnh lại các thông số liên quan đến database cần truy xuất là đủ.

Những phần mềm hỗ trợ hay dành cho Visual Studio

Là môi trường phát triển tích hợp mạnh mẽ và phổ biến nhất hiện nay, Visual Studio (VS) cung cấp cho các nhà phát triển những công cụ hết sức hữu ích trong việc xây dựng phần mềm. Tuy nhiên, Visual Studio không phải là hoàn hảo, nó không thể bao hết mọi "ngóc ngách" của việc lập trình. May mắn thay, các nhà phát triển trên khắp thế giới đã cung cấp rất nhiều công cụ bổ sung, có thể giúp bạn làm việc hiệu quả hơn với Visual Studio.
Bài viết này sẽ giới thiệu những công cụ như vậy, chúng hoàn toàn miễn phí, thậm chí còn là mã nguồn mở, bạn có thể sử dụng mà không phải trả bất cứ một khoản lệ phí nào (dù vẫn có những thỏa thuận bản quyền phải tuân theo).
Code Project Browser
Trang chủ: http://www.codeproject.com
Loại dự án: Mã nguồn mở
Nếu là "tín đồ” của lập trình Windows/.NET, bạn không thể không biết đến The Code Project, trang web hàng đầu cung cấp hàng chục nghìn bài báo/dự án về lập trình. Đây quả là kho dữ liệu phong phú với mọi lập trình viên. Còn gì tuyệt hơn khi bạn có thể tham khảo các bài báo của Code Project ngay trong VS?
Sau khi cài đặt, Code Project Browser sẽ tích hợp vào menu Tools của VS, bạn chỉ việc nhấn vào đây để bắt đầu. Chú ý là trong lần chạy đầu tiên, bạn cần nhập địa chỉ email và mật khẩu mà bạn đã đăng kí trên The Code Project.
Không chỉ là trình duyệt, công cụ này còn cho phép bạn mở mã nguồn mẫu của các bài báo chỉ với vài cú nhấn chuột. Thay vì phải tải về mã nguồn, giải nén và mở bằng VS, Code Project Browse làm tất cả việc này cho bạn.
Khi nhấn vào một link file .zip chứa mã nguồn, bạn sẽ được hỏi có mở dự án này không. Nếu có, add-in này sẽ tải dự án về, giải nén trong thư mục My Documents/ My Code Project Downloads và mở nó trong VS. Hơn thế nữa, bạn còn có thể quản lý các bài báo/dự án yêu thích trên Code Project thông qua công cụ này.
Bạn sẽ không phải duyệt Code Project bằng trình duyệt thông thường thêm một lần nào nữa! Bạn có thể tải và cài đặt add-in này từ địa chỉ http://www.codeproject.com/csharp/cpbrowser.asp


Ankhsvn: Quản lý phiên bản với Visual Studio

Trang chủ: http://ankhsvn.tigris.org
Loại dự án: Mã nguồn mở.
Nếu bạn làm việc theo nhóm trong các dự án lớn thì quản lý phiên bản mã nguồn là một công việc rất quan trọng. Có rất nhiều công cụ giúp bạn thực hiện việc này, nhưng nếu sử dụng chính Visual Studio thì sẽ tiện hơn nhiều. AnkhSVN là một bổ sung cho Visual Studio (từ phiên bản .NET 2002 trở đi) để hỗ trợ hệ thống quản lý mã nguồn Subversion. Nó cho phép bạn thực hiện hầu hết các thao tác quản lý phiên bản, ngay bên trong VS IDE. Hiện AnkhSVN chưa hỗ trợ tất cả các chức năng của SVN, nhưng phần lớn các thao tác sử dụng trong công việc hàng ngày đều đã được cung cấp.
AnknSVN phiên bản mới nhất là 1.0.1.2736 (stable), dung lượng 3.88 MB, tải về tại địa chỉ:
http://ankhsvn.tigris.org/servlets/ProjectDocumentList?folderID=7315

Chú ý là để sử dụng AnkhSVN bạn cần tải và cài đặt Subversion trước. Phiên bản hiện tại là 1.45, tải từ địa chỉ: http://subversion.tigris.org/project_packages.html
Code Style Enforcer: Chuẩn hóa mã nguồn
Trang chủ: http://joel.fjorden.se/static.php?page=CodeStyleEnforcer
Loại dự án: Miễn phí.
Chuẩn hóa mã nguồn theo những qui tắc nhất định luôn là yêu cầu bắt buộc đối với các lập trình viên chuyên nghiệp. Tuy nhiên, nếu không muốn bận tâm với việc này, bạn có thể để Code Style Enforcer làm việc đó cho bạn. Bổ sung này sẽ phát hiện những chỗ mã nguồn không hợp chuẩn và đưa ra phương án chỉnh sửa
Code Style Enforce là một plug-in của DXCode cho Visual Studio 2005, giúp kiểm tra mã nguồn thông qua các quy tắc đã được định nghĩa sẵn. Được phát triển cho C#, nhưng CSE có thể làm việc với VB .NET (chưa được kiểm tra). Chuẩn mã nguồn hiện có thể cấu hình với những quy tắc nhất định. Quy tắc mặc định dựa trên chuẩn viết mã C# của IDesign (http://www.idesign.net), đây là chuẩn viết mã hoàn chỉnh nhất hiện có và có thể tải về miễn phí.
Mỗi khi mở một dự án mới, Code Style Enforcer sẽ hỏi bạn sử dụng các quy tắc chung dành cho tất cả các dự án hay dành riêng cho từng dự án một. Điều này rất có ích nếu bạn cùng lúc tham gia làm nhiều dự án với nhiều nhóm khác nhau.
Code Style Enforcer sẽ gạch chân những biến, method không tuân theo quy tắc, tất cả những gì bạn cần làm là nhấn chuột phải và chọn Correct CSE Violation, với 2 tùy chọn nhỏ hơn: Sửa ngay lập tức theo những gì mà công cụ đề xuất, hay xem trước những thay đổi đối với mã của bạn (chỉ xuất hiện trong một số trường hợp):
Code Style Enforcer hiện chỉ chạy được trên Visual Studio 2005, do công cụ này hoàn toàn dựa trên .NET 2.0. Phiên bản mới nhất là 2.1.29, dung lượng 564KB. Cần chú ý, để cài đặt, trước tiên bạn cần tải và cài đặt bổ sung DXCore cho Visual Studio, phiên bản mới nhất là 2.5.1, dung lượng 17.3MB, tải về từ địa chỉ http://www.devexpress.com/Downloads/NET/IDETools/DXCore/


Pinvoke.net: Đơn giản hóa Windows API

Trang chủ: http://www.Pinvoke.net
Loại dự án: miễn phí (yêu cầu đăng kí)
Mặc dù .NET framework cung cấp hầu hết các hàm và công cụ mà lập trình viên cần, nhưng không tránh khỏi những khi phải "cầu viện" đến Windows APIs thông qua dịch vụ PInvoke. Việc này tuy không khó, nhưng đòi hỏi lập trình viên phải khai báo khá nhiêu khê và phức tạp. PInvoke.net là một plug-in giúp bạn giải quyết rắc rối này bằng cách truy cập đến trang web PInvoke.net để lấy các dữ liệu cần thiết về hàm API cần dùng và khai báo giúp bạn.
Sau khi cài đặt, PInvoke sẽ xuất hiện trong một menu riêng của Visual Studio. Khi cần sử dụng hàm API nào, bạn sẽ có 2 tùy chọn: Insert PInvoke signature: sử dụng các signature đã có sẵn của plug-in này hay là truy cập đến PInvoke.net để sử dụng các đoạn mã (có thể) chính xác và đầy đủ hơn.
PInvoke.Net tương thích với Visual Studio.NET 2003 (7.1) trở lên, chưa hỗ trợ VS 2008, dung lượng chỉ có 288 KB.
Power Toys Pack Installer: Luôn cập nhật Visual Studio của bạn

Trang chủ: http://www.codeplex.com/
Loại dự án: mã nguồn mở.
Thay vì phải liên tục theo dõi những gói bổ sung cho Visual Studio từ trang web của Microsoft và các trang khác, tải về và cài đặt, Power Toys Pack Installer sẽ làm việc đó cho bạn. Chương trình kiểm tra các bổ sung mới hoặc được cập nhật. Tất cả những gì bạn cần làm chỉ là đánh dấu chọn bổ sung thích hợp với mình và nhấn Install! Power Toys Pack Installer sẽ tự động tải về và cài đặt cho bạn.
Chương trình hiện có phiên bản mới nhất 1.0.1, dung lượng 504 KB, không cần cài đặt. Tải về từ địa chỉ: http://www.codeplex.com/PackInstaller/Release/ProjectReleases.aspx?ReleaseId=4274
GhostDoc: Tạo tài liệu từ mã nguồn
Trang chủ: http://www.roland-weigelt.de/ghostdoc .
Loại dự án: miễn phí.
Với comment (chú thích) dạng XML của C#, việc tạo tài liệu từ mã nguồn trở nên dễ dàng hơn rất nhiều, và có không ít công cụ giúp bạn thực hiện công việc đó. Tuy nhiên, chính việc comment theo định dạng XML chưa chắc đã "thú vị”. GhostDoc sẽ giải phóng bạn khỏi sự "nhàm chán".
Công cụ này cho phép tự động tạo comment theo định dạng XML cho một method từ kiểu, tham số, tên của nó cũng như các thông tin ngữ cảnh khác. Tất cả những việc bạn cần làm là chọn một method cần chú thích, nhấn chuột phải và chọn Document This. Điều tuyệt vời là GhostDoc cho phép bạn thiết lập định dạng Comment và những quy tắc đoán tên kiểu, tham số... cho phù hợp với phong cách viết mã của bạn.
Sau khi cài đặt, GhostDoc sẽ bổ sung thêm vào Menu Tools của VS một Submenu với 2 mục nhỏ hơn: Configure GhostDoc cho phép cấu hình GhostDoc và Document This (đôi khi sẽ disable) sẽ tự động comment cho file .cs hiện tại.
Mặc dù GhostDoc không phải lúc nào cũng làm việc chính xác, nhưng công cụ này rất đáng cho bạn sử dụng.
Hiện phiên bản mới nhất của GhostDoc là 2.1.1, dung lượng 898KB. Có 2 phiên bản dành riêng cho Visual Studio 2005 và 2008, đều hỗ trợ VB (có hạn chế) và Windows Vista. Phiên bản gần nhất dành cho VS 2003 là 1.30, chỉ hỗ trợ C# và không hỗ trợ Vista.
CodeKeep: Quản lý và chia sẻ Codesnippets
Trang chủ: http://www.codekeep.net .
Loại dự án: Miễn phí.
Một trong những thế mạnh của Visual Studio chính là Codesnippets, giúp lập trình viên sử dụng các đoạn mã có sẵn một cách nhanh chóng, thay vì phải code một cách thủ công.
CodeKeep nâng Code Snippets lên một tầm cao mới khi cho phép các lập trình viên trao đổi, chia sẻ các Snippet mà mình tạo ra. Điều này giúp bạn tiết kiệm được rất nhiều thời gian và sức lực, đồng thời đặc biệt hữu ích cho các bạn lập trình viên trẻ muốn học hỏi kinh nghiệm từ các "Guru".
Để có thể sử dụng CodeKeep, bạn phải tạo một account mới tại trang chủ của dự án này. Account này cho phép bạn tải lên và chia sẻ các snippet dễ dàng hơn.
CodeKeep sẽ thêm một submenu với 5 tính năng thiết lập, quản lý, duyệt, tìm kiếm và bổ sung để bạn làm việc với snippet. Trong đó đáng kể nhất là chức năng tìm kiếm. Mỗi khi cần bổ sung đoạn mã làm công việc nhất định mà không muốn phải tự viết code, bạn có thể sử dụng tính năng này để tìm kiếm các snippet thực hiện công việc tương tự. Chỉ việc gõ từ khóa, chẳng hạn Shutdown Windows, nhấn nút Go, đợi trong giây lát và chọn snippet phù hợp để sử dụng. Thật là tiện lợi!
Phiên bản mới nhất của công cụ này là 2.5, chỉ tương thích với Visual Studio 2005, dung lượng 85KB, tải tại địa chỉ: http://www.codekeep.net/downloads/CodeKeepVS2005Addin2.5.zip.
Lời kết: trên đây chỉ là những bổ sung phổ biến nhất cho Visual Studio. Chắc chắn còn nhiều bổ sung hữu ích khác mà bài viết chưa nói tới, rất mong được các bạn trao đổi, chia sẻ kinh nghiệm. Ngoài ra, các bổ sung tuy hay, nhưng đồng thời chúng cũng làm Visual Studio nặng nề hơn, dễ bị "crash" hơn, vì vậy các bạn nên thận trọng và chỉ sử dụng các bổ sung thật sự cần thiết với mình.

Xây dựng Windows Service với C# – Phần 6

Cài đặt (Installing) và kiểm thử (test) Service
Bước 19 :
Trong thư mục của project vừa tạo SetupGiamSatThuMuc --> bạn vào thư mục con có tênRelease và tìm tập tin có tên SetupGiamSatThuMuc.msi. Double-click tập tin này để start việc cài đặt (installation). Thao tác này sẽ start trình Setup Wizard. Chấp nhận tất cả các giá trị ngầm định và hoàn tất việc cài đặt (installation).
Bước 20 :
Để kiểm tra service vừa được cài đặt bạn cần sử dụng công cụ Service Control Managervới các bước thực hiện : click Start --> Programs --> Administrative Tools --> Services. Bạn sẽ thấy GiamSatThuMuc trong danh sách.
Bước 21 :
Click phải trên service của bạn và chọn Properties --> Start
cai dat windows service
Bước 22 :
Click Start --> Programs --> Administrative Tools --> Event Viewer (Các bước có thể khác tuỳ thuộc hệ điều hành mà bạn đang dùng) để xem sổ ghi biến cố trong Event Viewer.
Chúc các bạn thành công!









Xây dựng Windows Service với C# – Phần 5

Tạo một trình ứng dụng loại Setup để cài đặt (Install)Service:

Bước 13:

Từ menu à File --> Add Project --> New Project.

xay dung windows service trong C#

    Đặt tên ProjectsSetupGiamSatThuMuc

xay dung windows service trong C#

Bước 14:

Trong cửa sổ Solution Explorer, click phải chuột tại SetupGiamSatThuMuc --> Add Project Output

xay dung windows service trong C#

    Từ cửa sổ Add Project Output Group --> chọn Primary Output --> click OK

xay dung windows service trong C#

Bước 15:

Trong cửa sổ Solution Explorer, click phải chuột tại mục SetupGiamSatThuMuc -->View --> Custom Actions.

Bước 16 :

Tại mục Custom Actions --> click phải chuột --> Add Custom Action

Bước 17 :

Xuất hiện cửa sổ Select Item in Project --> Double-click mục Application Folder, chọn mục Primary Output from swGiamSatThuMuc (Active) --> click OK.

xay dung windows service trong C#

xay dung windows service trong C#

Bước 18 :

Thực hiện việc build trình ứng dụng SetupGiamSatThuMuc (chú ý nhớ chọn định cấu hình cho SolutionRelease ).   

xay dung windows service trong C#

Xây dựng Windows Service với C# – Phần 4

Thêm vào thành phần Installer :

Bước 9:

Click chuyển sang cửa sổ design của GiamSatThuMuc.cs. Bên trong cửa sổ này click phải chuột à click chọn mục Add Installer .

xay dung windows service

Một class có tên là ProjectInstaller.cs sẽ được thêm vào project của bạn. Bạn sẽ thấy ở màn hình design của thành phần này có hai biểu tượng thành tố khác trên nó là :ServiceProcessInstaller1ServiceInstaller1.

xay dung windows service

Bước 10:

Click vào ServiceProcessInstaller1 và hiển thị cửa sổ Properties --> tại thuộc tínhAccount click chọn LocalSystem trong danh sách  

xay dung windows service

Bước 11:

Click vào ServiceInstaller1 và hiển thị cửa sổ Properties. Chọn giá trị Automatic cho thuộc tính StartType

xay dung windows service

Bước 12:

Thực hiện việc build trình ứng dụng   

xay dung windows service

Xây dựng Windows Service với C# – Phần 3

Bước 5:

Trên cửa sổ design --> click vào biểu tượng EventLog --> cửa sổ Properties --> Tại mụcName đổi tên mặc định EventLog1 thành GetLoginNameEventLog

lap trinh C#

Bước 6:

Trên cửa sổ design --> click vào biểu tượng EventLog --> cửa sổ Properties --> Tại mụcName đổi tên mặc định EventLog1 thành SoGhiGiamSatThuMuc.

lap trinh C#

Bước 7:

Mở màn hình soạn thảo mã lệnh của GiamSatThuMuc.cs --> Bạn sẽ thấy rằng C# sẽ tự động bổ sung :

Dòng khai báo

using System.ServiceProcess 

Khai báo kế thừa từ class :

System.ServiceProcess.ServiceBase

Hai phương thức quan trọng được bổ sung:

protected override void OnStart(string[] args)

// TODO: Add code here to start your service.

protected override void OnStop()

// TODO: Add code here to perform any tear-down necessary to stop your service.

} 

Đây là hai phương thức có vai quan trọng. Các dòng lệnh mà bạn muốn chúng thực thi mỗi khi service start được đặt bên trong phương thức OnStart. Các dòng lệnh mà bạn muốn chúng thực thi mỗi khi service stop được đặt bên trong phương thức OnStop.

Bạn cần bổ sung vào phương thức khởi tạo của class GiamSatThuMuc các dòng lệnh sau:

public GiamSatThuMuc() 

    InitializeComponent(); 

if (!(System.Diagnostics.EventLog.SourceExists("GiamSatThuMuc_Source ")) ) 

    { 

        System.Diagnostics.EventLog.CreateEventSource("GiamSatThuMuc_Source", "GiamSatThuMuc_Log"); 

    } 

    GiamSatThuMucEventLog.Source = "GiamSatThuMuc_Source"; 

    GiamSatThuMucEventLog.Log = "GiamSatThuMuc_Log"; 

} 

Chú ý rằng bạn không nên đặt các dòng lệnh này ở phương thức OnStart, mặc dù việc bổ sung này khiến nó vẫn hoạt động. Lý do của việc bổ sung vào phương thức khởi tạo của class là để nó chỉ chạy một lần.

Bước 8:

Thêm mã chương trình vào các phương thức xử lý biến cố OnStartOnStop. Để viết đoạn mã lệnh cho phương thức OnStart, bạn gõ vào đoạn mã như trình bày sau đây:

protected override void OnStart(string[] args) 

    FileSystemWatcher watch = new FileSystemWatcher(); 

    watch.Path = @"c:\Watcher\";

    watch.Changed += new FileSystemEventHandler(OnChanged);

    watch.Created += new FileSystemEventHandler(OnChanged);

    watch.Deleted += new FileSystemEventHandler(OnChanged);

    watch.Renamed += new RenamedEventHandler(OnRenamed);

    watch.EnableRaisingEvents = true;

    watch.IncludeSubdirectories = true;

    Console.ReadLine();

}

//--------------------------------------------------

private void OnChanged(object source, FileSystemEventArgs e)

{

    // Specify what is done when a file is changed, created, or deleted.

    string dir = @"c:\Watcher\" + e.Name;

    if (e.FullPath == dir)

    {

         Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);

         GiamSatThuMucEventLog.WriteEntry("Da co thao tac Change trong thu muc Watcher tren C");

     }

}

// ----------------------------------------------------------------------------------

private void OnRenamed(object source, RenamedEventArgs e)

{

    // Specify what is done when a file is renamed.

    string dir = @"c:\Watcher\" + e.Name;

    if (e.FullPath == dir)

    {

         Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);

         GiamSatThuMucEventLog.WriteEntry("Da co thao tac rename trong thu muc Watcher tren C"); 

    } 

} 

Đoạn mã lệnh trên nhằm mục tiêu khi service được start trình ứng dụng sẽ giám sát thư mục C:\Watcher. Bạn có thể bổ sung thêm theo ý mình, ở đây chúng ta chỉ viết mã lệnh tướng ứng với các sự kiện OnChangedOnRenamed.

Chú ý: Trong phần mã lệnh của GiamSatThuMuc.Designer.cs bạn cần sửa biểu thị private àpublic tương ứng với khai báo GiamSatThuMucEventLog dòng lệnh sau:

public System.Diagnostics.EventLog GiamSatThuMucEventLog; 

Xây dựng Windows Service với C# – Phần 2

II Tạo ứng dụng loại Windows Service.

Bước 1:

Khởi động Visual Studio .NET và tạo một project mới với việc sử dụng mẫu Windows Service. Đặt tên cho project là wsGiamSatThuMuc và chứa nó vào một thư mục trên máy tính của bạn.

windows service in C#

Bước 2:

Trên cửa sổ Solution Explorer đổi tên của component có tên Service1.cs thànhGiamSatThuMuc.cs.

Bước 3:

DoubleClick vào GiamSatThuMuc.cs à Properties window. Trên cửa sổ Properties lần lượt thực hiện các công việc sau:
· Tại mục ServiceName: đổi tên mặc định service1GiamSatThuMuc.
· Tại mục AutoLog : Thiết lập giá trị là False.
· Tại mục CanStop: Thiết lập giá trị là True.

windows service in C#

Bước 4:

Click chọn hiển thị hộp công cụ (Toolbox) của Visual Studio .NET --> click tab : Components --> click chọn EventLog (Là một component) kéo thả vào cửa sổ design.

windows service in C#

Xây dựng Windows Service với C# – Phần 1

Bài viết này sẽ hướng dẫn các bạn viết một trình ứng dụng với mục tiêu âm thầm theo dõi giám sát một thư mục nào đó trên máy tính. Do trình ứng dụng thuộc loại Windows Service nên sau khi viết xong các bạn có thể cài đặt và vận hành nó giống như là một service

I. Tổng quan

Windows Services cung cấp phương tiện cho application logic chạy liên tục trên máy tính của bạn, thông thường là việc cung cấp điều khiển thiết bị hoặc các dịch vụ hệ điều hành.Windows Services là hữu dụng đối với các ứng dụng phía server mà ta muốn chúng phải luôn ở trạng thái sẵn sàng phục vụ các yêu cầu từ client. Nói chung, nếu bạn có nhu cầu xây dựng một trình ứng dụng mà bản chất hoạt động của nó mang tính “âm thầm làm việc” và không cần sự tương tác trực tiếp của người dùng, bạn có thể nghĩ ngay đến việc tạo trình ứng dụng loại Windows Service.

Windows Service là một ứng dụng chạy trên máy server hoặc workstation và cung cấp những chức năng mà sự diễn tiến của nó không cần sự tương tác trực tiếp của người dùng. Windows Services thường được dùng để giám sát hoạt động hệ thống.

Một Windows Service sẽ chạy trong tiến trình của riêng nó, không phụ thuộc người dùng hay các chương trình khác đang chạy trên cùng máy tính. Windows Services thường được cấu hình để tự động bắt đầu khi nào máy tính khởi động. Không giống như đa phần các ứng dụng, Windows Services chạy dưới nhận dạng bảo mật của chính nó, thay vì dưới nhận dạng của đăng nhập người dùng hiện hành. Chúng có thể bắt đầu chạy, ngay cả nếu không có người dùng (user) đăng nhập máy tính.

Khi mà bạn tạo một ứng dụng với mục tiêu ứng dụng này sẽ chạy như là một Windows Service, bạn cần phải lưu ý rằng nó không bao gồm bất kỳ các yếu tố giao tiếp người dùng như Message Boxes hay Dialog Boxes. Một Windows Service không có tính chất cung cấp một giao diện trực quan (visual interface) cho người dùng.

Thông thường một Windows Service sẽ báo cáo đặc thù các kết quả và thông báo lỗi của nó tới một sổ ghi biến cố (event log). Tuy nhiên bạn cũng có thể kết hợp nó với Web Service để làm những việc “động trời” hơn như là âm thầm chuyển thông tin từ máy mà nó đang được cài đặt đến một máy ở xa thông qua đường truyền internet.

Nếu như bạn đã quen thuộc với Microsoft SQL Server 2000, bạn sẽ nhận thấy nó chạy như là một Windows Service. Một ví dụ dễ hiểu của ứng dụng Windows ServiceWindows Time Service, nó cập nhật thông tin đồng hồ mà bạn thấy trên thanh taskbar của máy tính. Trước đây, việc phát triển các ứng dụng dạng này là rất khó khăn. Giờ đây, nhờ có .NET Framework chứa một tập các class, cung cấp các chức năng cơ bản cho việc cài đặt và phát triển dễ dàng các ứng dụng Windows Service trên nền C# .NET .

String Format trong C#

Trong khi lập trình, chúng ta thường gặp phải rất nhiều trường hợp cần định dạng lại một chuỗi như chuỗi số, chuỗi ngày tháng sao cho đúng yêu cầu.

Ví dụ: định dạng ngày tháng: MM/dd/yyyy ta muốn chuyển sang dd/MM/yyyy cho thuần Việt.

Sau đâu là các kiểu chuyển đổi, định dạng chuỗi trong C#

Định dạng số chữ số sau dấu chấm trong số thập phân

String.Format("{0:0.00}", 123.4567);      // "123.46"
String.Format("{0:0.00}", 123.4);         // "123.40"
String.Format("{0:0.00}", 123.0);         // "123.00"
Định dạng số chữ số trước dấu chấm trong số thập phân
String.Format("{0:00.0}", 123.4567);      // "123.5"
String.Format("{0:00.0}", 23.4567);       // "23.5"
String.Format("{0:00.0}", 3.4567);        // "03.5"
String.Format("{0:00.0}", -3.4567);       // "-03.5"
Thêm dấu ngăn cách hàng nghìn
String.Format("{0:0,0.0}", 12345.67);     // "12,345.7"
String.Format("{0:0,0}", 12345.67);       // "12,346"
Thêm số 0 vào trước số
String.Format("{0:00000}", 15);          // "00015"
String.Format("{0:00000}", -15);         // "-00015"
Căn số sang phải hay trái dựa vào kích cỡ ta cung cấp
String.Format("{0,5}", 15);              // "   15"
String.Format("{0,-5}", 15);             // "15   "
String.Format("{0,5:000}", 15);          // "  015"
String.Format("{0,-5:000}", 15);         // "015  "
Định dạng ngày tháng
String.Format("{0:M/d/yyyy}", dt);            // "3/9/2008"
String.Format("{0:MM/dd/yyyy}", dt);          // "03/09/2008"
String.Format("{0:t}", dt);  // "4:05 PM"                         ShortTime
String.Format("{0:d}", dt);  // "3/9/2008"                        ShortDate
String.Format("{0:T}", dt);  // "4:05:07 PM"                      LongTime
String.Format("{0:D}", dt);  // "Sunday, March 09, 2008"          LongDate
String.Format("{0:f}", dt);  // "Sunday, March 09, 2008 4:05 PM"  LongDate+ShortTime
String.Format("{0:F}", dt);  // "Sunday, March 09, 2008 4:05:07 PM" FullDateTime
String.Format("{0:g}", dt);  // "3/9/2008 4:05 PM"                ShortDate+ShortTime
String.Format("{0:G}", dt);  // "3/9/2008 4:05:07 PM"             ShortDate+LongTime
String.Format("{0:m}", dt);  // "March 09"                        MonthDay
String.Format("{0:y}", dt);  // "March, 2008"                     YearMonth
String.Format("{0:r}", dt);  // "Sun, 09 Mar 2008 16:05:07 GMT"   RFC1123
String.Format("{0:s}", dt);  // "2008-03-09T16:05:07"             SortableDateTime
Hi vọng với những ví dụ trên, các bạn có thể định dạng các chuỗi hiển thị lên ứng dụng của mình một cách khoa học nhất.