2011-09-07 31 views
5

Python (a dizede onun kimliğini kullanarak) dinamik olarak C# bir eski COM nesnesi başlatmasını tek yaptığım win32com.client.Dispatch("Myapp.Thing.1") olduğunu ve bana üzerinde yöntemleri ve bu tür çağırabilir bir nesne sağlar .Bu COM nesnesi kullanmak istediğinizde,

C# bunu yapmak ve, şok edici, nasıl anlamaya görünüyor olamaz istiyorum. Otomatik olarak oluşturulmuş COM sarmalayıcılarından birini kullanmak istemediğim için numaralı telefonu kullanmak istemiyorum. Geçmiş zamanların geç bağlayıcı, dinamik COM'unu yapmalıyım.

bunu yaparken denedim ama çağırmak çağrı üzerine bir null Referans İstisna olsun.

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

adıyla bir COM nesnesi yüklemek ve ideal olacaktır bazı temel tarzda kullanmak mümkün olan herhangi bir örnek kod.

+0

Jason öncelikle kodunuza bazı kontroller ekleyebilir ve t veya o null olarak tanımlayabilir misiniz? eğer öyleyse ve eğer bize söylerseniz, o zaman ona bakmaya başlayabiliriz. –

+0

Sadece o kontroller yerine oturuyorum, ne geri ne de geri dönüyor. Yardımın için çok teşekkürler! – William

+0

ve xyz yönteminin bu nesnede var olduğundan emin misiniz? –

cevap

8

Türünüz GetTypeFromProgID aracılığıyla alındığında, aslında sizde yok - oluşturduğunuz COM nesnesini saran bir __ComObject türünüz var - bu nedenle üzerinde "xyz" yöntemi bulunmuyor. Bu nedenle boş referans istisnası - GetMethod("xyx") boş döndü. yöntemi çağırmak için

yerine t.InvokeMember("xyz", BindingFlags.InvokeMethod, null, o, args) kullanın:

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

' den daha kolay kullanabiliyor gibi görünüyor. Ve özellikleri nasıl alabilirim? Çok teşekkürler! böylece 'BindingFlags.GetField' veya' BindingFlags.GetProperty' kullanın ve - – William

+0

Hala ınvokemember kullanın 'BindingFlags' parametresi ne kontrol eder. Http://msdn.microsoft.com/en-us/library/66btctbe.aspx ve http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx adresine bakın. –

8

Bunu tam olarak ne için olduğunu var dinamik türü kullanmak gerekir. Örneği sarmalayıcılar olmadan yazamazsınız. Bunun yerine bunu yapabilirsin.

dynamic app = Activator.CreateInstance(
             Type.GetTypeFromProgID("MyApp.Thing.1")); 
app.XYZ(): 
İlgili konular