2010-05-05 3 views
7

Tôi có một thể hiện của một đối tượng COM ... mà được tạo ra như thế này:Gọi phương pháp sử dụng Reflection on COM Object

Type type = TypeDelegator.GetTypeFromProgID("Broker.Application"); 
Object application = Activator.CreateInstance(type); 

Khi tôi cố gắng gọi một phương pháp:

type.GetMethod("RefreshAll").Invoke(application, null); 

- >type.GetMethod("RefreshAll") trả về null. Khi tôi cố gắng để có được tất cả các phương pháp với type.GetMethods(), chỉ có các phương pháp:

  1. GetLifetimeService
  2. InitializeLifetimeService
  3. CreateObjRef
  4. ToString
  5. Equals
  6. GetHashCode
  7. GetType

Phương thức RefreshAll ở đâu? Và làm thế nào tôi có thể gọi nó?

Trả lời

12

Bạn không thể sử dụng GetMethod trên các đối tượng COM, bạn phải sử dụng một cách khác nhau:

this.application.GetType().InvokeMember("RefreshAll", BindingFlags.InvokeMethod, null, this.application, null); 

Tôi đang sử dụng cách này trong một dự án cũ mà sử dụng COM nên nó phải làm việc ok cho bạn.

+1

Mặc dù một câu trả lời tốt vào thời điểm đó, C# 4 làm cho nó dễ dàng hơn để thực hiện COM-interop qua 'từ khóa dynamic' dưới đây – MickyD

+1

Chú ý, đến từ sử dụng 'dynamic' trong công cụ của tôi https : //github.com/awaescher/RepoZ Tôi phát hiện rò rỉ bộ nhớ nặng với nó. Tôi chuyển sang câu trả lời từ Nathan W để sửa lỗi đó! Xem thêm tại đây: https://stackoverflow.com/questions/33080252/memory-overflow-having-an-increasing-number-of-microsoft-csharp-runtimebinder-s/34123315 – Waescher

+0

Xem các nhận xét khác về câu trả lời của MickyD về cách đối phó với vấn đề này ... – Waescher

4

Tôi nhận ra đây là câu trả lời trễ nhưng C# 4 thay đổi mọi thứ một chút với việc giới thiệu từ khóa dynamic được thiết kế với ý tưởng COM-interop.

MSDN: kịch bản interop

COM mà nhóm C# nhắm mục tiêu cụ trong bản phát hành C# 4 được lập trình với các ứng dụng Microsoft Office, chẳng hạn như Word và Excel. Mục đích là để làm cho nhiệm vụ này dễ dàng và tự nhiên trong C# vì nó luôn ở trong Visual Basic. [1]

Mã của bạn lúc này là:

Type type = TypeDelegator.GetTypeFromProgID("Broker.Application"); 
dynamic application = Activator.CreateInstance(type); 
application.RefreshAll(); // <---- new in c# 4 

Bây giờ bạn sẽ không thấy RefreshAll() trong Visual Studio hoàn tuyên bố vì vậy đừng lo lắng. Nó sẽ biên dịch.

[1] Understanding the Dynamic Keyword in C# 4

+1

Chú ý, đến từ việc sử dụng 'năng động' trong công cụ của tôi https://github.com/awaescher/RepoZ Tôi đã phát hiện ra những rò rỉ bộ nhớ nặng với nó. Tôi chuyển sang câu trả lời từ Nathan W để sửa lỗi đó! Xem thêm tại đây: https: // stackoverflow.com/questions/33080252/memory-overflow-có-một-tăng-số-of-microsoft-csharp-runtimebinder-s/34123315 – Waescher

+0

@Waescher lẻ xem xét MS đã làm cho nó cho COM ở nơi đầu tiên. Tôi nghi ngờ bạn chỉ là không phát hành những điều đúng mà không có gì để làm với ** năng động ** – MickyD

+0

@ Waescher ooh Tôi chỉ làm một số googling và nó xuất hiện bạn là chính xác. Nasty chút ** năng động **. Tốt tìm thấy – MickyD