2011-09-07 6 views
5

En Python, cuando quiero utilizar este objeto COM, todo lo que hago es win32com.client.Dispatch("Myapp.Thing.1") y me da un objeto que puedo llamar métodos y demás .Crear una instancia de un objeto COM heredado en C# de forma dinámica (utilizando su ID en una cadena)

Quiero hacer esto en C# y, sorprendentemente, no puedo entender cómo. Hago no quiero usar uno de esos contenedores COM generados automáticamente, por razones que no puedo entrar. Necesito hacer el enlace dinámico y tardío de los tiempos pasados.

He intentado hacer esto, pero recibo una excepción de Ref Nulo en la invocación.

Type t = Type.GetTypeFromProgID("Myapp.Thing.1") 
o = Activator.CreateInstance(t) 
t.GetMethod("xyz").Invoke(o, args) 

Cualquier código de ejemplo que es capaz de cargar hasta un objeto COM por su nombre y utilizarlo de alguna manera básica sería lo ideal.

+0

Jason primero que todo, ¿puede agregar algunos controles en su código e identificar si t o o como nulo? si es así y si nos lo dices, entonces podemos comenzar a analizarlo. –

+0

Acabo de volver a realizar esos controles, ni t ni o vuelven a ser nulos. ¡Muchas gracias por su ayuda! – William

+0

y ¿está seguro de que el método xyz existe en ese objeto? –

Respuesta

8

Cuando su tipo se recupera mediante GetTypeFromProgID, en realidad no tiene el tipo - tiene un tipo __ComObject que envuelve el objeto COM creado - por lo que no tiene el método "xyz" en él. Por lo tanto, su excepción de referencia nula - GetMethod("xyx") está devolviendo nulo.

Con el fin de invocar el método, utilice t.InvokeMember("xyz", BindingFlags.InvokeMethod, null, o, args) lugar:

Type t = Type.GetTypeFromProgID("Myapp.Thing.1") 
o = Activator.CreateInstance(t) 
t.InvokeMember("xyz", BindingFlags.InvokeMethod, null, o, args) 
+0

¡Parece que está funcionando! ¿Y cómo obtengo/fijo propiedades? ¡Muchas gracias! – William

+0

Aún usa InvokeMember, el parámetro 'BindingFlags' controla lo que hace: use' BindingFlags.GetField' o 'BindingFlags.GetProperty', y así sucesivamente. Consulte http://msdn.microsoft.com/en-us/library/66btctbe.aspx y http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx –

8

Usted debe utilizar el tipo dinámico que es exactamente lo que es para. No podrás escribir la instancia sin los envoltorios. En cambio, puedes hacer esto.

dynamic app = Activator.CreateInstance(
             Type.GetTypeFromProgID("MyApp.Thing.1")); 
app.XYZ(): 
Cuestiones relacionadas