2010-05-05 13 views
7

Ho un'istanza di un oggetto COM ... che si crea in questo modo:metodo Invoke utilizzando la riflessione su oggetti COM

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

Quando provo a invocare un metodo:

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

- >type.GetMethod("RefreshAll") restituisce null. Quando cerco di ottenere tutti i metodi con type.GetMethods(), c'è solo questi metodi:

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

Dove si trova il metodo RefreshAll? E come posso invocarlo?

risposta

12

Non è possibile utilizzare GetMethod su oggetti COM, è necessario utilizzare un diverso modo :

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

sto usando in questo modo in un progetto vecchio che utilizza COM quindi dovrebbe funzionare bene per voi.

+1

Anche se una risposta bene, al momento, C# 4 rende molto più facile per eseguire COM-interoperabilità tramite il dynamic' parola chiave 'sotto – MickyD

+1

Attenzione, provenienti da usando' dynamic' nel mio strumento https : //github.com/awaescher/RepoZ Ho scoperto pesanti perdite di memoria con esso. Sono passato alla risposta di Nathan W per risolverlo! Vedi di più qui: https://stackoverflow.com/questions/33080252/memory-overflow-having-an-increasing-number-of-microsoft-csharp-runtimebinder-s/34123315 – Waescher

+0

Vedere gli altri commenti sulla risposta di MickyD su come affrontare il problema ... – Waescher

4

Mi rendo conto che questa è una risposta tardiva, ma C# 4 cambia le cose un po 'con l'introduzione della parola chiave dynamic che è stata progettata con in mente COM-interop.

MSDN: scenario di interoperabilità

Il COM che il C# team specificamente mirati nella versione C# 4 è stata la programmazione contro le applicazioni Microsoft Office, come Word ed Excel. L'intento era di rendere questo compito facile e naturale in C# come sempre in Visual Basic. [1]

il codice diventa ora:

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

Ora non vedrà RefreshAll() nel completamento Visual Studio dichiarazione in modo da non allarmatevi. Si compilerà.

[1] Understanding the Dynamic Keyword in C# 4

+1

Attenzione, derivando dall'uso di 'dynamic' nel mio strumento https://github.com/awaescher/RepoZ ho scoperto pesanti perdite di memoria con esso. Sono passato alla risposta di Nathan W per risolverlo! Vedi di più qui: https: // StackOverflow.it/questions/33080252/overflow di memoria-con-un-crescente-numero-di-microsoft-csharp-runtimebinder-s/34123315 – Waescher

+0

@Waescher dispari considerando MS ha fatto per COM in primo luogo. Sospetto che tu non stia semplicemente rilasciando le cose correttamente che non ha nulla a che fare con ** dynamic ** – MickyD

+0

@Waescher ooh Ho appena fatto qualche ricerca su google e sembra che tu abbia ragione. Nasty little ** dynamic **. Buona scoperta – MickyD

Problemi correlati