2010-03-04 35 views
5

Gần đây tôi đã dành khá nhiều thời gian để viết các dự án Visual Studio Extensions khác nhau. Mặc dù các dự án là tất cả các mã được quản lý để truy cập vào các dịch vụ VS lõi nhưng vẫn cần thiết để làm việc với các giao diện COM kiểu cũ.COM interop reference guidelines guidelines

Dưới đây là một ví dụ:

var selectionTracker = (IVsMonitorSelection)serviceProvider.GetService(typeof(SVsShellMonitorSelection)); 
IntPtr ppHier; 
uint pitemid; 
IVsMultiItemSelect ppMIS; 
IntPtr ppSC; 
selectionTracker.GetCurrentSelection(out ppHier, out pitemid, out ppMIS, out ppSC))) 

như bạn có thể nhìn thấy cuộc gọi này trả về 2 con trỏ (ppHier và ppSC) và một đối tượng ppMIS. Câu hỏi đặt ra là: làm thế nào tôi nên đi về chơi nó tốt đẹp với tính tham chiếu COM.

Đó là sự hiểu biết của tôi rằng trong COM thế giới khi một phương thức trả về một con trỏ đến một đối tượng con trỏ này là AddRef'ed trước khi nó được trả về. Điều đó có nghĩa là để ngăn chặn rò rỉ đối tượng COM, tôi phải giải phóng chúng khi tôi sử dụng chúng.

Tôi cũng giả định rằng những gì tôi đang nhận được như một đối tượng nó đã được bọc vào một RCW, mà sẽ chăm sóc tài liệu tham khảo phát hành khi nó được hoàn thành.

Hai giả định này được áp dụng cho cuộc gọi ở trên có nghĩa là tôi phải đảm bảo gọi 'Marshal.Release' trên 2 con trỏ của mình, nhưng tôi không nên làm bất cứ điều gì về tính tham chiếu liên quan đến đối tượng được trả về.

Để rephrase câu hỏi của tôi: giả sử rằng các đối tượng COM tôi đang sử dụng đang chơi bởi các quy tắc COM, là cách tiếp cận trên đúng cách để đối phó với tính tham chiếu COM?

Trả lời

0

Trong trường hợp cụ thể này, bạn cần phải gọi Marshal.Release trên các biến số IntPtr nếu không chúng sẽ không biến mất. Tất nhiên nếu bạn yêu cầu marshaller chỉ sử dụng đối tượng (hoặc một kiểu cụ thể) trực tiếp thì bạn sẽ không cần phải lo lắng về nó vì RCW sẽ đảm bảo đối tượng bị hủy tại một số điểm trong tương lai (tức là khi finalizer được gọi quy trình thu gom rác). Tất nhiên cách tiếp cận finalizer có thể xảy ra tại một điểm không xác định trong thời gian vì vậy nếu đối tượng duy trì một số tài nguyên mà bạn cần để thoát khỏi bạn lý tưởng nên gọi Marshal.ReleaseComObject để giảm số lượng tham chiếu của nó trước khi trình bao bọc không phát hành cho bạn.

Các vấn đề liên quan