Lập trình .Net và .Com

4 334 1
Lập trình .Net và .Com

Đang tải... (xem toàn văn)

Thông tin tài liệu

Lập trình .NET COM Gvhd: Nguyễn Tấn Trần Minh Khang 246 Chương 22 Lập trình .NET COM Chương này nói về những điều còn lại của C# (và .NET Framework). Khi xây dựng công bố chuẩn OLE 2.0, sau đó là COM ActiveX, Microsoft đã quảng cáo một cách rầm rộ về "khả năng" lập trình các thành phần, sau đó gắn chúng lại để có các ứng dụng. Bên cạnh đó là khả năng viết một lần dùng cho tất cả ngôn ngữ của COM. Tuy nhiên COM vẫn vướng mắc một số hạn chế như vấn đề phiên bản khá "khó nuốt". .NET Framework mới ra đời lại mang một kiến trúc khác, không hạn chế về ngôn ngữ, giải quyết "xong" vấn đề phiên bản. Tuy nhiên trong các công ty hiện nay vẫn còn "vô số COM", .NET Framework buộc phải tiếp tục hỗ trợ COM. Dưới đây là các vấn đề mà .NET Framework giải quyết được: • Hiểu cho phép sử dụng các ActiveX control trong môi trường Vs.NET • Hiểu cho phép sử dụng các đối tượng COM • Cho phép chuyển một lớp .NET thành một COM Ngoài ra, như đã giới thiệu C# hỗ trợ kiểu con trỏ của C++ với mục đích có được sự mềm dẻo của C/C++. Kiểu con trỏ được khuyên không nên sử dụng vì đoạn mã dùng con trỏ được xem là không an toàn. Nó chỉ thích hợp cho các thao tác với các COM, các thư viện hàm DLL, hay gọi trực tiếp đến các Win API. 22.1 P/Invoke Khởi đầu Platform invoke facility (P/Invoke - dễ dàng gọi các giao diện lập trình của hệ điều hành/sàn diễn) được dự định cung cấp một cách thức để truy cập đến các hàm Windows API, nhưng ta có thể dùng nó để gọi các hàm thư viện DLL. Ví dụ sắp trình bày sử dụng hàm Win API MoveFile của thư viên kernal32.dll. Ta khai báo phương thức static extern bằng attribute DllImport như sau: [DllImport("kernel32.dll", EntryPoint="MoveFile", ExactSpelling=false, CharSet=CharSet.Unicode, SetLastError=true)] static extern bool MoveFile( string sourceFile, string destinationFile); Lớp DllImport (cũng là lớp DllImportAttribute) để chỉ ra một phương thức không được quản lý (unmanaged) được gọi thông qua P/Invoke. Các tham số được giải thích như sau: EntryPoint: Tên hàm được gọi ExactSpelling : đặt giá trị false để không phân biệt hoa thường CharSet : tập ký tự thao tác trên các tham số kiểu chuỗi Lập trình .NET COM Gvhd: Nguyễn Tấn Trần Minh Khang 247 SetLastError: đặt giá trị true để được phép gọi hàm GetLastError (Win API) kiểm tra lỗi Ví dụ 22-1 Sử dụng P/Invoke để gọi WinAPI using System; using System.IO; using System.Runtime.InteropServices; namespace Programming_CSharp { class Tester { // khai báo hàm WinAPI muốn gọi P/Invoke [DllImport("kernel32.dll", EntryPoint="MoveFile", ExactSpelling=false, CharSet=CharSet.Unicode, SetLastError=true)] static extern bool MoveFile( string sourceFile, string destinationFile); public static void Main( ) { Tester t = new Tester( ); string theDirectory = @"c:\test\media"; DirectoryInfo dir = new DirectoryInfo(theDirectory); t.ExploreDirectory(dir); } private void ExploreDirectory(DirectoryInfo dir) { string newDirectory = "newTest"; DirectoryInfo newSubDir = dir.CreateSubdirectory(newDirectory); FileInfo[] filesInDir = dir.GetFiles( ); foreach (FileInfo file in filesInDir) { string fullName = newSubDir.FullName + "\\" + file.Name; file.CopyTo(fullName); Console.WriteLine("{0} copied to newTest", file.FullName); } filesInDir = newSubDir.GetFiles( ); // xóa một vài tập tin // đổi tên một vài tập tin int counter = 0; foreach (FileInfo file in filesInDir) { string fullName = file.FullName; if (counter++ %2 == 0) { // P/Invoke Win API Tester.MoveFile(fullName, fullName + ".bak"); Console.WriteLine("{0} renamed to {1}", fullName,file.FullName); } else Lập trình .NET COM Gvhd: Nguyễn Tấn Trần Minh Khang 248 { file.Delete( ); Console.WriteLine("{0} deleted.", fullName); } } newSubDir.Delete(true); } } } Kết quả (một phần): c:\test\media\newTest\recycle.wav renamed to c:\test\media\newTest\recycle.wav c:\test\media\newTest\ringin.wav renamed to c:\test\media\newTest\ringin.wav Một lần nữa, chỉ nên gọi P/Invoke trong trường bất khả kháng. Sử dụng các lớp .NET Framework để có đoạn mã được quản lý. 22.2 Con trỏ Như đã đề cập ở trên, chỉ nên sử dụng con trỏ khi làm việc với các COM, WinAPI, hàm DLL. Các toán tử sử dụng với con trỏ tương tự như C/C++ &: toán tử lấy địa chỉ *: toán tử lấy nội dung con trỏ ->: toán tử đến các thành viên của con trỏ Ví dụ dưới đây sử dụng con trỏ làm tham số cho hai hàm WinAPI CreatFile ReadFile. Ví dụ 22-2 Sử dụng con trỏ trong C# using System; using System.Runtime.InteropServices; using System.Text; class APIFileReader { // import hai phương thức, phải có từ khóa unsafe [DllImport("kernel32", SetLastError=true)] static extern unsafe int CreateFile( string filename, uint desiredAccess, uint shareMode, uint attributes, uint creationDisposition, uint flagsAndAttributes, uint templateFile); // API phải dùng con trõ [DllImport("kernel32", SetLastError=true)] static extern unsafe bool ReadFile( int hFile, void* lpBuffer, Lập trình .NET COM Gvhd: Nguyễn Tấn Trần Minh Khang 249 int nBytesToRead, int* nBytesRead, int overlapped); // hàm dựng: mở một tập tin đã tồn tại public APIFileReader(string filename) { fileHandle = CreateFile( filename, // tập tin GenericRead, // cách truy xuất - desiredAccess UseDefault, // shareMode UseDefault, // attributes OpenExisting, // creationDisposition UseDefault, // flagsAndAttributes UseDefault); // templateFile } // unsafe: cho phép tạo con trỏ // ngữ cảnh unsafe (unsafe context) public unsafe int Read(byte[] buffer, int index, int count) { int bytesRead = 0; // fixed: cấm CLR dọn dẹp rác fixed (byte* bytePointer = buffer) { ReadFile( fileHandle, // hfile bytePointer + index, // lpBuffer count, // nBytesToRead &bytesRead, // nBytesRead 0); // overlapped } return bytesRead; } const uint GenericRead = 0x80000000; const uint OpenExisting = 3; const uint UseDefault = 0; int fileHandle; } class Test { public static void Main( ) { APIFileReader fileReader = new APIFileReader("myTestFile.txt"); // tạo buffer ASCII coder const int BuffSize = 128; byte[] buffer = new byte[BuffSize]; ASCIIEncoding asciiEncoder = new ASCIIEncoding( ); // đọc tập tin vào buffer hiển thị ra màn hình console while (fileReader.Read(buffer, 0, BuffSize) != 0) { Console.Write("{0}", asciiEncoder.GetString(buffer)); } } } . Lập trình .NET và COM Gvhd: Nguyễn Tấn Trần Minh Khang 246 Chương 22 Lập trình .NET và COM Chương này nói về những điều còn lại của C# (và .NET Framework) còn "vô số COM& quot;, và .NET Framework buộc phải tiếp tục hỗ trợ COM. Dưới đây là các vấn đề mà .NET Framework giải quyết được: • Hiểu và cho phép sử

Ngày đăng: 30/09/2013, 02:20

Hình ảnh liên quan

// đọ ct ập tin vào buffer và hiển thị ra màn hình console    while (fileReader.Read(buffer, 0, BuffSize) != 0)  - Lập trình .Net và .Com

ct.

ập tin vào buffer và hiển thị ra màn hình console while (fileReader.Read(buffer, 0, BuffSize) != 0) Xem tại trang 4 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan