gcapnias wrote: |
... Το δεύτερο, που πρέπει να γίνει εδώ, είναι στα Properties του VB.NET project στο Configuration Properties / Build να τσεκάρεις το Register for COM Interop. ...
|
|
Θέλει λίγη προσοχή αυτό το σημείο. (Γιώργο δεν έχω δει τον κώδικά σου, απλά το θίγω για λόγους πληρότητας).
Αν ενεργοποιήσεις απλά το "Register for COM Interop" τότε παράγεις ένα component που υποστηρίζει μόνο late binding, δηλαδή δεν θα παραχθεί το dual interface που απαιτείται για την υποστήριξη του early binding.
Γι αυτόν το λόγο χρειάζεται να κάνεις δύο πράγματα. Το πρώτο είναι να δηλώσεις explicitly (και κατόπιν να υλοποιήσεις μέσα στην κλάση) το interface.
Το δεύτερο και σημαντικότερο είναι να κάνεις assign κάποιo συγκεκριμένo UUID για το interface και DispId για τα τμήματα του Interface, δηλαδή να επιβάλεις προγραμματιστικά το binary compatibility (hello VC++ developers). Αν δεν το κάνεις αυτό και αρκεστείς μόνο στο πρώτο βήμα, αν τυχόν ξανακάνεις compile το .NET project σου, τότε θα σπάσει το compatibility και όπου έχεις παίξει με early binding θα έχεις errors ενώ όπου έχεις παίξει με late binding (μιας και εκεί χρειάζεται μόνο το όνομα) δεν θα έχεις πρόβλημα.
Τέλος, το attribute AssemblyDescription στο AssemblyInfo.vb είναι χρήσιμο γιατί ότι βάλεις εκεί θα το βρεις στη λίστα με τις περιγραφές των COM components που θα βάλεις reference. Επίσης,
μόνο αν έχεις δηλώσει και υλοποιήσει explicitly ένα interface όπως είπαμε, θα πρέπει να χρησιμοποιήσεις και το attribute ClassInterface όπου θα του δώσεις την τιμή ClassInterfaceType.None. Με αυτόν τον τρόπο θα εμποδίσεις τον type library exporter να παράγει και να δηλώσει ένα IDispatch interface ως default interface και θα χρησιμοποιηθεί αντ' αυτού το δικό σου.
Αν όλα τα παραπάνω φαίνονται κινέζικα ή εξαιρετικά δύσκολα στην υλοποίηση - έχω μια υποψία ότι για να δηλώσεις το πλήρες interface μιας κλάσης που αντιστοιχεί σε φόρμα είναι ένα μικρό πρόβλημα - τότε πρόσεξε το εξής: Άπαξ και φτιάξεις μια φορά το component σε VB.NET και μετά το χρησιμοποιήσεις από VB6, αν κάνεις recompile το component, τότε θα πρέπει να το ξανακάνεις reference μέσα από την VB6.
Vir prudens non contra ventum mingit