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?