600
Chương 15: Khả năng liên tác mã lệnh không-được-quản-lý
7.
7.
Gi i phóng nhanh thành ph n COM
ả
ầ
Gi i phóng nhanh thành ph n COM
ả
ầ
Bạn cần bảo đảm một thành phần COM được xóa khỏi bộ nhớ ngay tức thì,
không phải chờ bộ thu gom rác (Garbage Collector) làm việc. Hoặc bạn muốn
bảo đảm các đối tượng COM được giải phóng theo một thứ tự xác định.
Sử dụng phương thức tĩnh
Marshal.ReleaseComObject
và truyền RCW thích hợp
để giải phóng tham chiếu đến đối tượng COM nằm dưới.
COM sẽ đếm các tham chiếu đến đối tượng để xác định khi nào đối tượng sẽ được giải phóng.
Khi bạn sử dụng một RCW, tham chiếu sẽ được giữ cả khi biến đối tượng vượt khỏi tầm vực.
Tham chiếu này chỉ được giải phóng khi bộ thu gom rác giải phóng đối tượng RCW. Do đó,
bạn không thể kiểm soát việc các đối tượng COM sẽ được giải phóng khi nào hoặc theo thứ tự
nào.
Để vượt qua hạn chế này, bạn có thể sử dụng phương thức
Marshal.ReleaseComObject
. Trong
ví dụ ở mục 15.6, bạn hãy thêm hai dòng sau vào cuối mã lệnh để giải phóng đối tượng
Recordset
và
Connection
nằm dưới.
Marshal.ReleaseComObject(rs);
Marshal.ReleaseComObject(con);
Về mặt kỹ thuật, phương thức
ReleaseComObject
không thực sự giải phóng đối
tượng COM, nó chỉ giảm số lượng tham chiếu đến đối tượng. Nếu số tham chiếu
là 0, đối tượng COM sẽ được giải phóng. Tuy nhiên, nếu cùng thể hiện của một
đối tượng COM được sử dụng tại nhiều mẩu mã lệnh, nó phải được giải phóng ở
các nơi đó trước khi được giải phóng khỏi bộ nhớ.
8.
8.
S d ng thông s tùy ch n
ử ụ
ố
ọ
S d ng thông s tùy ch n
ử ụ
ố
ọ
Bạn cần gọi một phương thức trong thành phần COM mà không phải truyền tất
cả các thông số cần thiết.
Sử dụng trường
Type.Missing
.
Hầu hết các phương thức trong .NET Framework đều được nạp chồng nhiều lần để bạn có thể
gọi phiên bản yêu cầu chỉ những thông số do bạn cung cấp. Mặt khác, COM không hỗ trợ việc
nạp chồng phương thức. Thay vào đó, các thành phần COM thường sử dụng các phương thức
với một danh sách dài các thông số tùy chọn. Không may là, C# không hỗ trợ thông số tùy
chọn, nghĩa là người phát triển phải cung cấp thêm các giá trị không cần thiết khi truy xuất
một thành phần COM. Và vì các thông số COM thường được truyền bằng tham chiếu nên mã
lệnh của bạn không thể truyền một tham chiếu
null
, mà phải khai báo một biến đối tượng và
rồi truyền biến đó.
Bạn có thể giảm nhẹ vấn đề đến một chừng mực nào đó bằng cách cung cấp trường
Type.Missing
bất cứ khi nào muốn bỏ qua một thông số tùy chọn. Nếu cần truyền một thông