1. Trang chủ
  2. » Công Nghệ Thông Tin

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

4 335 1
Tài liệu đã được kiểm tra trùng lặp

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập trình .Net và .Com
Tác giả Nguyễn Tấn Trần Minh Khang
Chuyên ngành Lập trình
Thể loại Chương sách
Định dạng
Số trang 4
Dung lượng 264,3 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Dưới đây là các vấn đề mà .NET Framework giải quyết được: • Hiểu và cho phép sử dụng các ActiveX control trong môi trường Vs.NET • Hiểu và cho phép sử dụng các đối tượng COM • Cho phé

Trang 1

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)

Khi xây dựng và công bố chuẩn OLE 2.0, sau đó là COM và 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 và 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", 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ử dụng các ActiveX control trong môi trường Vs.NET

• Hiểu và 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

Trang 2

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 và

// đổ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

Trang 3

{

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 và 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,

Trang 4

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ỏ và

// 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 và ASCII coder

const int BuffSize = 128;

byte[] buffer = new byte[BuffSize];

ASCIIEncoding asciiEncoder = new ASCIIEncoding( );

// đọc tập tin vào buffer và hiển thị ra màn hình console

while (fileReader.Read(buffer, 0, BuffSize) != 0)

{

Console.Write("{0}", asciiEncoder.GetString(buffer));

}

}

}

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) (Trang 4)

TỪ KHÓA LIÊN QUAN

w