2012-04-16 36 views
5

Tôi có một lớp C# com được sử dụng bởi mã không bị nhiễu. Tôi có thể gỡ lỗi nó, nhưng tôi không thể biết khi nào một đối tượng được phát hành. Nếu nó đã được implementd trong c + + descructur sẽ được gọi, trên C# nó sẽ được phát hành để GC. Có cách nào để theo dõi khoảnh khắc đó không? Cảm ơn trước.Theo dõi bản phát hành của đối tượng com C#.

+0

Bạn đang tìm kiếm trình hoàn thiện? – SLaks

+0

Chỉ cần tò mò, bạn có thể sử dụng một C# [destructor] (http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx) trong tình huống này? –

+0

Không có câu trả lời hạnh phúc ở đây. Cá thể lớp [ComVisible] của bạn là một đối tượng .NET cũ đơn giản. Nó được giữ sống bằng một tham chiếu trong CCW. Lệnh Release() cuối cùng hủy hoại CCW nhưng không có gì xảy ra với đối tượng .NET của bạn. Cho đến khi nó được thu gom rác như bình thường. Bạn sẽ cần gỡ lỗi mã gốc. Trường hợp vấn đề không có nghi ngờ là nằm anyway. –

Trả lời

1

Loại được quản lý duy trì tài nguyên không được quản lý nên triển khai giao diện IDisposable. Điều này cho người tiêu dùng biết mã của bạn rằng họ cần phải gọi Dispose() về các trường hợp của (các) đối tượng của bạn khi họ kết nối với họ (tức là, bọc chúng trong một khối using khi có thể).

Thực hiện đúng cách IDisposable sẽ phát hành tài nguyên gốc trong trình hoàn thiện của họ, nhưng khách hàng có thể gọi số Dispose() sớm hơn để phát hành xác định tài nguyên không được quản lý. Dù bằng cách nào bạn tránh bị rò rỉ, nhưng tốt hơn bạn nên gọi số Dispose() càng nhanh càng tốt.

Here is an SO question chi tiết quy trình.

+0

Vấn đề là tôi không thể kiểm soát mã không được quản lý. Có arent bất kỳ dọn dẹp cần thiết mà không thể được thực hiện bởi GC. Tôi chỉ muốn biết tuổi thọ của đối tượng là gì. – user629926

+0

Nếu bạn không kiểm soát được mã gốc thì tôi không hiểu câu hỏi. Mã được quản lý không có cách nào để dọn sạch mã gốc trừ khi mã gốc định nghĩa một giao diện để làm như vậy. GC chăm sóc của wrapper quản lý của bạn là không thích hợp; nó không chỉ dọn dẹp một cách kỳ diệu những thứ tự nhiên. Bạn phải làm điều đó cho mình bằng cách thực hiện IDisposable và gọi một số chức năng trên nguồn gốc của bạn để giải phóng nó. –

+0

Tôi không có bất kỳ tài nguyên gốc để dọn dẹp, chỉ muốn biết khi nào warper được quản lý nhận ra. – user629926

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