2012-09-07 12 views
8

Sto cercando di convertire alcune VB6/COM + il codice per C#/COM +Perché C# CreateObject è molto più dettagliato di VB.NET?

Tuttavia, se in VB6 o VB.NET ho:

Dim objAdmin 
objAdmin = Server.CreateObject("AppAdmin.GUI") 
objAdmin.ShowPortal() 

In C# sembra come devo fare quanto segue:

object objAdmin = null; 
System.Type objAdminType = System.Type.GetTypeFromProgID("AppAdmin.GUI"); 
m_objAdmin = System.Activator.CreateInstance(objAdminType); 
objAdminType.InvokeMember("ShowPortal", System.Reflection.BindingFlags.InvokeMethod, null, objAdmin, null); 

C'è un modo per ottenere C# per non dover utilizzare la funzione InvokeMember e chiamare semplicemente la funzione direttamente?

+4

Risposta breve: Perché VB è stato progettato fin dall'inizio per il consumo di oggetti COM, mentre C# non lo era. – phoog

risposta

11

C'è un modo per ottenere C# per non dover usare la funzione InvokeMember e basta chiamare direttamente la funzione?

Sì, come C# 4 con dynamic typing:

dynamic admin = Activator.CreateInstance(Type.GetTypeFromProgID("AppAdmin.GUI")); 
admin.ShowPortal(); 

E 'ancora più dettagliato nella parte CreateObject, ma si può sempre avvolgere che in una chiamata di metodo se si voleva. (Ci può essere una chiamata in corso non sono a conoscenza, oppure si potrebbe tentare di trovare qualsiasi VB sta chiamando in questo caso -. Non conosco i dettagli di Server.CreateObject)

noti che tipizzazione dinamica è più ricco di solo rendendo la riflessione più semplice, ma lo fa sicuramente. Dietro le quinte, lo stesso genere di cose succederà in entrambi i casi - non sarà ancora veloce come il binding statico, ma è quasi certamente veloce sufficiente.

6

Sì, è possibile utilizzare la parola chiave dynamic

dynamic objAdmin = System.Activator.CreateInstance(objAdminType); 
objAdmin.ShowPortal(); 
-1

Se si ha accesso al tipo di classe effettiva, si può fare come segue:

AppAdminClass m_objAdmin = (AppAdminClass)System.Activator.CreateInstance(typeof(AppAdminClass)); 
m_objAdmin.ShowPortal(); 
Problemi correlati