2010-05-05 13 views
7

tengo una instancia de un objeto COM ... que se crea de esta manera:método Invoke Reflexión sobre el uso de objetos COM

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

Cuando trato de invocar un método:

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

- >type.GetMethod("RefreshAll") devuelve null. Cuando intento para obtener todos los métodos con type.GetMethods(), sólo hay estos métodos:

  1. GetLifetimeService
  2. InitializeLifetimeService
  3. CreateObjRef
  4. ToString
  5. es igual a
  6. GetHashCode
  7. GetType

¿Dónde está el método RefreshAll? ¿Y cómo puedo invocarlo?

Respuesta

12

No puede utilizar GetMethod de objetos COM, usted tiene que utilizar un manera diferente:

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

estoy usando de esta manera en un proyecto de edad que utiliza COM así que debería funcionar bien para usted.

+1

Aunque una respuesta bien en el momento, C# 4 hace que sea mucho más fácil de realizar COM-interoperabilidad a través de la palabra clave 'dynamic' continuación – MickyD

+1

Atención, que viene de usar' dynamic' en mi herramienta https : //github.com/awaescher/RepoZ Descubrí fuertes pérdidas de memoria con él. ¡Cambié a la respuesta de Nathan W para arreglar eso! Vea más aquí: https://stackoverflow.com/questions/33080252/memory-overflow-having-an-increasing-number-of-microsoft-csharp-runtimebinder-s/34123315 – Waescher

+0

Vea los otros comentarios en la respuesta de MickyD sobre cómo lidiar con el problema ... – Waescher

4

Me doy cuenta de que esta es una respuesta tardía pero C# 4 cambia un poco las cosas con la introducción de la palabra clave dynamic que fue diseñada con COM-interop en mente.

MSDN:

El escenario de interoperabilidad COM que el equipo # C blanco específico en el comunicado de C# 4 estaba programando contra las aplicaciones de Microsoft Office, como Word y Excel. La intención era hacer esta tarea tan fácil y natural en C# como siempre lo fue en Visual Basic. [1]

Su código se convierte ahora en:

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

Ahora usted no verá RefreshAll() en la terminación de Visual Studio comunicado por lo que no se alarme. Compilará.

[1] Understanding the Dynamic Keyword in C# 4

+1

Atención, viniendo de usar 'dynamic' en mi herramienta https://github.com/awaescher/RepoZ Descubrí fuertes pérdidas de memoria con él. ¡Cambié a la respuesta de Nathan W para arreglar eso! Vea más aquí: https: // stackoverflow.com/questions/33080252/memory-overflow-having-an-increase-number-of-microsoft-csharp-runtimebinder-s/34123315 – Waescher

+0

@Waescher, impar teniendo en cuenta que MS lo hizo para COM en primer lugar. Sospecho que no estás liberando las cosas correctamente, lo cual no tiene nada que ver con ** dynamic ** – MickyD

+0

@Waescher ooh Acabo de buscar en Google y parece que estás en lo cierto. Desagradable pequeño ** dinámico **. Buen hallazgo – MickyD

Cuestiones relacionadas