Η CreateObject κρύβει από πίσω της την Activator.CreateInstance. Στο .NET δεν υπάρχουν μέθοδοι χωρίς κλάσεις. Η CreateObject είναι ουσιαστικά ένας wrapper στο Activator.CreateInstance(Type.GetTypeFromProgID("My.ProgID)) και Activator.CreateInstance(Type.GetTypeFromCLSID("My.CLSID)) για λόγους backwards compatibility.
Επειδή η C# είναι statically typed γλώσσα δεν μπορείς απλά να δημιουργήσεις ένα αντικείμενο με την CreateInstance και να αρχίζεις να καλείς μεθόδους με myObject.SomeMethod() καθώς ο compiler θα ψάξει να βρει την SomMethod() στον τύπο Object - όπου δεν υπάρχει. Στην C# 4 θα πρέπει να ορίσεις τον τύπο του αντικειμένου ως dynamic για να συμπεριφερθεί όπως και στην VB. Πριν την C# 4 αυτό δεν γίνεται. Το κακό με το dynamic είναι ότι αν κάνεις κάποιο λάθος θα φανεί μόνο όταν τρέξει ο κώδικας. Αυτό το πρόβλημα όμως το έχεις και με την VB.
Αντί να φτιάχνεις το αντικείμενο με το ProgID μπορείς να προσθέσεις ένα reference στη βιβλιοθήκη του όπως γίνεται και με τα .NET assemblies. Αυτό παίζει και με εκδόσεις πριν την C# 4, ενεργοποιεί το Intellisense και γίνεται και έλεγχος κατά το compile ότι δεν έγραψες τίποτε περίεργο.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos