2012-09-18 29 views
7

Tôi có một đối tượng COM dynamic COM làm trường riêng tư trong lớp học của mình. Tôi không chắc liệu nó được coi là tài nguyên được quản lý (GC làm sạch nó) hay không.Các đối tượng COM động có được coi là tài nguyên được quản lý không?

private dynamic _comConnector = null; 

...

_comConnector = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId")); 

Khi thực hiện IDispose, tôi nên làm sạch nó lên như một nguồn lực quản lý (chỉ khi Dispose() được gọi một cách rõ ràng), hoặc như một nguồn tài nguyên tự nhiên (khi Dispose (false) được gọi từ finalizer)?

private void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     // Free managed resources // 

     // --> Should I call Marshal.FinalReleaseComObject(_comConnector) here? 
    } 

    // Free unmanaged resources // 

    // --> Or maybe here? 
} 
+0

Có, GC làm sạch nó. Nó không thực hiện IDisposable vì vậy không có gì để vứt bỏ. –

+0

Có ở đây sau khi googling 'là Activator.CreateInstance quản lý hoặc unmanaged' ... và tôi đã tìm kiếm vì Vứt bỏ. –

Trả lời

6

Đó là tài nguyên được quản lý (về cơ bản là Trình bao bọc có thể gọi thời gian chạy) và bạn nên làm sạch nó như vậy. MSDN states that:

Mỗi RCW duy trì bộ nhớ cache của giao diện con trỏ trên đối tượng COM bao bọc và giải phóng tham chiếu trên đối tượng COM khi RCW không còn cần thiết nữa. Thời gian chạy thực hiện bộ sưu tập rác trên RCW.

I.e. RCW là một tài nguyên được quản lý bao bọc các tham chiếu COM không được quản lý.

Là một sang một bên, việc phát hành các đối tượng COM có thể nguy hiểm nếu bạn đang sử dụng chúng từ nhiều luồng ở nhiều nơi trong ứng dụng của bạn, như được mô tả trong this blog post from Chris Brumme.

Nếu bạn đang sử dụng một đối tượng COM trong một phạm vi, đơn luồng, sau đó bạn có thể an toàn gọi ReleaseComObject trên đối tượng đó khi bạn đang thực hiện với nó: hy vọng đây là trường hợp của bạn.

0

1 COM là thành phần để tất cả phụ thuộc vào những gì anh ấy làm. nếu nó đáp ứng các chức năng sau

  • mở file

  • kết nối mạng mở

  • nhớ Switch

  • Trong XNA: bộ đệm đỉnh, bộ đệm chỉ mục, kết cấu, vv

=> Vì vậy, có nó không được quản lý ressource

rác Collector không có thông tin về ressource này, vì vậy sạch là dành cho người dùng

2 Đối với nước sạch, bạn chỉ có thể sử dụng phương pháp Dispose (Hoặc sử dụng khối; người gọi vứt bỏ vào cuối điều trị).

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