2011-09-07 8 views
5

In Python, quando voglio usare questo oggetto COM, tutto ciò che faccio è win32com.client.Dispatch("Myapp.Thing.1") e mi dà un oggetto che posso chiamare metodi e così via .Istanziare un oggetto COM legacy in C# in modo dinamico (usando il suo ID in una stringa)

Voglio farlo in C# e, sconvolgente, non riesco a capire come. Io faccio non voglio usare uno di quei wrapper COM generati automaticamente, per ragioni per cui non riesco a entrare. Ho bisogno di fare il binding in ritardo, la COM dinamica di un tempo.

Ho provato a farlo, ma ottengo un'eccezione Null Ref per la chiamata di richiamo.

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

Qualsiasi codice di esempio che è in grado di caricare un oggetto COM suo nome e utilizzarlo in qualche modo di base sarebbe ideale.

+0

Jason prima di tutto è possibile aggiungere alcuni controlli nel codice e identificare se t o o come null? se è così e se ci dici, allora possiamo iniziare a guardarlo. –

+0

Ho appena effettuato questi controlli, né t né o sta tornando a zero. Grazie mille per il vostro aiuto! – William

+0

e sei sicuro che il metodo xyz esiste su quell'oggetto? –

risposta

8

Quando il tipo viene recuperato tramite GetTypeFromProgID, in realtà non hanno il tipo - si dispone di un tipo di __ComObject che avvolge l'oggetto COM creato - in modo da non avere metodo "xyz" su di esso. Quindi l'eccezione di riferimento null - GetMethod("xyx") restituisce null.

Al fine di richiamare il metodo, utilizzare t.InvokeMember("xyz", BindingFlags.InvokeMethod, null, o, args) invece:

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

Sembra che funzioni! E come posso ottenere/impostare proprietà ?? Grazie mille! – William

+0

Usi ancora InvokeMember, il parametro 'BindingFlags' controlla ciò che fai - usa' BindingFlags.GetField' o 'BindingFlags.GetProperty', e così via. Vedere http://msdn.microsoft.com/en-us/library/66btctbe.aspx e http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx –

8

Si dovrebbe usare il tipo dinamico è esattamente quello che è per. Non sarai in grado di digitare l'istanza senza i wrapper. Invece puoi farlo.

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