2013-02-10 60 views
9

Trong số related question, tôi lưu ý rằng trình gỡ lỗi của Visual Studio có thể liệt kê các thuộc tính của tham chiếu System.__ComObject, là "loại ẩn được sử dụng khi loại trình bao bọc không rõ ràng" - ví dụ: loại đối tượng bạn nhận được khi bạn lấy nó từ một đối tượng COM và không nhanh chóng nó tự hỏi:Trình gỡ rối/cửa sổ tương tác của Visual Studio đổ các thuộc tính của đối tượng COM trong .NET như thế nào?

COM Object Debug View

Ngoài ra, nếu bạn chỉ cần viết nhận dạng một đối tượng COM của vào Window ngay lập tức, tài sản và giá trị của nó được tương tự đổ:

COM Object Immediate Window

Lưu ý rằng điều này tách biệt với "Dynamic View" của VS2010, mà tôi tin rằng sử dụng IDispatch và phản ánh COM để liệt kê các thuộc tính của đối tượng COM mà không cần sử dụng PIA và phản xạ .NET. Các đối tượng tôi đang làm việc với làm không thực hiện IDispatch (cũng không làm họ thực hiện IProvideClassInfo cho rằng vấn đề), và như vậy, "Dynamic View" là không thể có được bất kỳ thông tin về họ:

Dynamic View

Điều thú vị là, trình gỡ lỗi của SharpDevelop không thể liệt kê các thành viên của System.__Comobject s (ví dụ: point.Envelope), chỉ các RCW mạnh mẽ (ví dụ: point).

SharpDevelop debugger

Vậy Visual Studio có thể làm như thế nào? Tôi tin rằng trong trường hợp này, đó là vì Hội đồng Interop chính tồn tại với định nghĩa cho các giao diện được hỗ trợ bởi các đối tượng này, và Visual Studio có khả năng sử dụng sự phản ánh để liệt kê các giao diện và thuộc tính được hỗ trợ. Điều đó có chính xác không? Và nếu vậy, nó hoạt động như thế nào?

Để bắt đầu, cách truy cập vào PIA? Liệu nó chỉ xem xét các PIA hiện đang được tải hay nó tải động chúng (và nếu có, làm thế nào)? Làm thế nào để nó xác định giao diện nào, trong đó có thể có nhiều, để liệt kê các thuộc tính của? Nó chỉ dường như sử dụng một, và không nhất thiết phải là người đầu tiên. Từ documentation của API tôi đang làm việc với (ArcObjects), giao diện mặc định cho các đối tượng này là IUnknown, do đó, nó không chỉ sử dụng giao diện mặc định.

Trong ví dụ trong ảnh chụp màn hình, giao diện liệt kê các thành viên là giao diện IEnvelope, được kế thừa từ giao diện IGeometry. Làm thế nào để VS2010 không biết liệt kê các thành viên của IGeometry thay vào đó, trong thử nghiệm của tôi, xuất hiện đầu tiên nếu bạn chỉ liệt kê tất cả các loại giao diện trong PIA? Một cái gì đó rất thông minh xảy ra hoặc có lẽ tôi đang thiếu một cái gì đó hiển nhiên?

Lý do tôi hỏi là nhà phát triển của LINQPadappears willing để triển khai chức năng tương tự nếu anh ấy biết VS thực hiện điều đó như thế nào. Vì vậy, một câu trả lời tốt ở đây có thể đi một chặng đường dài để giúp cải thiện công cụ rất phổ biến đó.

+0

Vì loại thuộc tính Phong bì của lớp Điểm được xác định trong PIA là IEnvelope, VS có khả năng bán phá giá nó, không cần một cơ chế đặc biệt. –

+0

Hmm là nó thực sự đơn giản? Thông tin này chỉ có sẵn tại thời điểm gỡ lỗi? (Làm thế nào) có thể thu được cùng một thông tin trong thời gian chạy? Và tại sao không trình gỡ lỗi của SharpDevelop làm như vậy (có lẽ họ không quan tâm). – blah238

+0

Vâng, nó rất đơn giản. Nó phức tạp hơn khi bạn chỉ có System._ComObject, nhưng khi bạn có thể truyền chúng thành giao diện ComImport .NET, thì bạn có quyền truy cập vào các giao diện bố trí này. Nó có sẵn mọi lúc, kể cả intellisense. Tôi không biết về SharpDevelop. –

Trả lời

2

Đây là cách để làm điều đó:

  • lấy IDispatch COM đối tượng (thay thế đường có thể là IDispatchEx)
  • có được một tài liệu tham khảo để gõ thư viện - IDispatch::GetTypeInfo
  • loại tải thư viện và liệt kê các thuộc tính
  • truy vấn đối tượng thực sự cho các giá trị cho các thuộc tính được khám phá

Các bổ sung nâng cao bổ sung được áp dụng: truy vấn IPersist* họ giao diện hoặc IProvideClassInfo để thu được tham chiếu đến typelibrary cho đối tượng và khám phá các thuộc tính.

+0

Như tôi đã viết, không có giao diện nào được thực hiện bởi các đối tượng này. Trên thực tế một số người trong số họ thực hiện 'IPersist' nhưng không phải tất cả. Tôi sẽ phải kiểm tra xem cái nào làm và không và so sánh với những gì VS2010 có thể tìm hiểu về chúng. – blah238

+0

'IDispatchEx',' IProvideClassInfo2' (tốt, đây là một điển hình, không phải 'IProvideClassInfo') - nên có một cái gì đó –

+0

Không, không phải của những người là tốt. – blah238