Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Form.NET ΣΕ VB6

Îåêßíçóå áðü ôï ìÝëïò gmlogic. Τελευταία δημοσίευση από το μέλος gmlogic στις 12-07-2005, 23:57. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  11-07-2005, 16:22 3420

    Geeked [8-|] Form.NET ΣΕ VB6

    Επειδή θέλω να συνεχίσω σε .net μπορώ να φτιάξω μία form σε .net να την κάνω
    πχ control και να την ενσωματόσω στη VB6
    [^o)]
    Ευχαριστω


    George Matzouranis
  •  12-07-2005, 19:40 3442 σε απάντηση της 3420

    Re: Form.NET ΣΕ VB6

    Συνημμένα: vbnet2vb6.rar
    Εδώ σου έχω ένα παράδειγμα, σαν συννημένο στο μύνημα Big Smile

    Μερικά λόγια για το πως παίζει:

    Για να μπορέσω να δείξω μια φόρμα VB.NET από μια VB6, σκέφτηκα να φτιάξω ένα .ΝΕΤ Assembly - Class Library και να την ενσωματτώσω σε αυτό, αφού μπορώ για αυτό να φτιάξω ένα COM Wrapper - να μπορεί να το χειριστεί κάποιος από COM, δηλαδή και VB6.

    Μέσα στο directory vbnetclass του συννημένου αρχείου είναι ένα setup για το VB.NET assembly. Αυτό περιέχει τον κώδικα του VB.NET class και το εκτελέσιμο .dll και το .tlb που χρειάζεται για να το δει όποια COM εφαρμογή. Το project περιέχει μια WinForm και μια Class.

    Το WinForm είναι Friend για να μπορεί κάποιος να το χειριστεί μόνο από το ίδιο assembly. Στο Class έχει μια method (displayClientForm()) που "σηκώνει" την φόρμα στην μνήμη, την δείχνει σαν dialog, περιμένει να φύγει από την οθόνη για να συνεχίσει,  και μετά την ξεφορτώνει.

    Αυτό που είναι το σημαντικό εδώ είναι ότι στην μέθοδο έχω προσθέσει μια ιδιότητα, COMVisible(True), για να είναι ορατή μέσω του COM Interface. Πρέπει να έχει γίνει import το System.Runtime.InteropServices.

    Το δεύτερο, που πρέπει να γίνει εδώ, είναι στα Properties του VB.NET project στο Configuration Properties / Build να τσεκάρεις το Register for COM Interop.

    Μετά την εγκατάσταση του NET component στο client, μέσα από το VB6 project, στα references του project, προσθέτεις το .tlb που έχει φτιάξει για σένα, είναι μέσα στο directory που έχει εγκατασταθεί το .dll με το VB.NET assembly. Από κει και πέρα όλα θεωρώ ότι είναι απλά.

    Μέσα στο directory vbproject που είναι μέσα στο συννημένο είναι ο κώδικας του VB6 project που κάνει χρήση του VB.NET Assembly.

    Ελπίζω να βοήθησα,
    George J.

    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  12-07-2005, 20:37 3444 σε απάντηση της 3442

    Re: Form.NET ΣΕ VB6

     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
  •  12-07-2005, 23:57 3447 σε απάντηση της 3420

    Geeked [8-|] Re: Form.NET ΣΕ VB6

    Παιδιά σας ευχαριστώ πολύ
    για την προτασή σας και τό κόπο σας
    Θα το κοιτάξω
    Big Smile


    George Matzouranis
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems