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

 

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

Ερώτηση για περίεργη κλήση VBScript μέσα από VB.NET

Îåêßíçóå áðü ôï ìÝëïò rama. Τελευταία δημοσίευση από το μέλος rama στις 30-08-2005, 16:31. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  30-08-2005, 11:48 4805

    Ερώτηση για περίεργη κλήση VBScript μέσα από VB.NET

    Καλημέρα. Θα κάνω μία απλουστευμένη περιγραφή του τι έχω και του προβλήματος. Ελπίζω κάποιος να ξέρει κάτι παραπάνω γιατί έχω αρχίσει να κοιτάω με άλλο μάτι το πληκτρολόγιο (break ... smash ... chop...)

    Έχω ένα αντικείμενο τύπου Field σε VB.NET.

    Class Field
    Default Property Item (index as integer) as Field...
    Default Property Item (index as integer, Optional b as boolean = false)  as Field...
    Default Property Item (index as integer, Optional opt as string = "", Optional a as integer = 0, Optional b as boolean = false)  as Field...
    end Class

    και ένα δεύτερο τύπου Msg

    Class Msg
    Property Fields () as Field
    end Class

    Χρησιμοποιώ το  ScriptControl για να εκτελέσω μέσα από την εφαρμογή μου σε VB.NET ρουτίνες σε VBScript που χρησιμοποιούν το παραπάνω αντικείμενο. Το αντικείμενο το περνάω στο context του Script με την AddObject μέθοδο του ScriptControl.

    Το πρόβλημα είναι οτι δεν μπορώ να χρησιμοποιήσω τις properties του Fields, εκτός από την πρώτη υλοποίηση της Item, δηλ αυτή που δεχεται απλά ένα int. Αν δοκιμάσω να καλέσω την Item με κάποιο άλλο set παραμέτρων παίρνω το παρακάτω error.

    Wrong number of arguments or invalid property assignment: 'myMsg.Fields.Item'

    Η κλήση μου ήταν myMsg.Fields.Item("2","*",0,false)

    Επειδή τα 3 τελευταία arguments σε αυτή την κλήση είναι optional δοκίμασα αρχικά να τρέξω κάτι σαν αυτό
    myMsg.Fields.Item("2")

    To αποτέλεσμα είναι να μετατρέψει η VBScript το "2" σε 2 και να καλέσει την πρώτη υλοποίηση της Item. Μετά ανακάλυψα οτι η VBScript δεν υποστηρίζει Optional Arguments.

    Τελικά μπορώ να κανω μια κλήση με τα 4 arguments?

    PS: Μερικές φορές παίρνω σαν σφάλμα "Object does not support automation", μάλλον επειδή δεν βρίσκει το Field το Item που του ζητώ. Τι σχέση έχει το Automation???? Δεν χρησιμοποιώ OLE.

    Ευχαριστώ για την υπομονή σας!

  •  30-08-2005, 12:09 4807 σε απάντηση της 4805

    Απ: Ερώτηση για περίεργη κλήση VBScript μέσα από VB.NET

    H VBScript δεν καταλαβαίνει από overloading οπότε είναι περίεργο που τρέχει έστω και για την πρώτη περίπτωση ο κώδικας. Εξάλλου η VBScript ΕΙΝΑΙ γλώσσα που χρησιμοποιεί Automation. Όταν καλείς την AddObject ουσιαστικά ζητάς τη δημιουργία ενός OLE object.

    Αλλά γιατί χρησιμοποιείς το Script control αντί για το CodeDOM? Με το CodeDOM μπορείς να κάνεις parse on-the-fly κώδικα γραμμένο σε οποιαδήποτε γλώσσα του .NET. Ή μπορείς να χρησιμοποιήσεις το Script for the .NET Framework για να κάνεις περίπου ό,τι γινόταν παλιά με το Script control, αλλά σε καθαρό .NET περιβάλλον. Δες και το http://msdn.microsoft.com/library/en-us/dnclinic/html/scripting06112001.asp για μια περιγραφή του Script for .NET
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  30-08-2005, 12:26 4811 σε απάντηση της 4807

    Απ: Ερώτηση για περίεργη κλήση VBScript μέσα από VB.NET

    Οπότε από ότι καταλαβαίνω δεν γίνεται να καλέσω το property με τον τρόπο/υλοποιήση που θέλω.
    Το error με το automation τελικά κατάλαβα οτι εμφανίζεται όταν το Field object πετάει exception. Θα κοιτάξω αυτά που μου πρότεινες.
  •  30-08-2005, 13:11 4817 σε απάντηση της 4805

    Απ: Ερώτηση για περίεργη κλήση VBScript μέσα από VB.NET

    Μου φαίνεται ότι τα έχεις μπερδέψει λίγο...

    Δυστχώς δεν ξέρω VB.NET οπότε  μπορεί και να μην σου τα λέω καλά... αλλά αυτή η ανάμειξη Default Properties., Optional Arguments, Overoading, και COM είναι μιά καλή συνταγή για να μπερδευτείς μιά χαρά...

    • Κατ΄ αρχήν τι το θες το Default Property; (Τέλος πάντων minor θέμα)...Πάμε παρακάτω...
    • Έχεις κάνει overload (implicitly κιόλας μια και δεν χρησιμοποιείς το Overloads keyword) την Item Property. Τρια overloads με το χέρι...
    • Τα Optional Arguments που βάζεις κόβω το κεφάλι μου (που λέει ο λόγος) ότι ο compiler τα υλοποιεί με overloads.. (Άλλα επτά -αν μέτρησα καλά- implicit overloads). Για να μην σου πω ότι το overloading μπορεί να το κάνει το ίδιο το CLR...
    • Σύνολο 10 overloaded εκδόσεις της Item Property που είναι και Default...
    • Και στο καπάκι την περνάς και με COM σε VBScript για να κάνεις τα VBScript κόλπα σου (εξ ου και το automation error)...

    Τώρα, αν το παρατηρήσεις κάποια από τα (3) overloads που φτιάχνεις εσύ, με κάποια από τα (7) overloads που φτιάχνει ο compiller ταυτίζονται... Από την άλλη το overloading δημιουργεί mangled names... Και που να ξέρω εγώ τώρα πως όλα αυτά τα διαχειίζεται η VBScript που δημιουργεί ένα instance του Field Class μέσω ScriptControl (δηλαδή φτιάχνεις ένα OLE obejct όσο κι αν δεν το πιστεύεις);

    Εμένα μου μυρίζει μπαρούτι...

    Προετίνω να δεις μήπως σου ξέφυγε κανένα warning στο compilation... Προτείνω επίσης να χάσεις τα Optional Arguments και να ξαναδκομάσεις... Αν δεν πάει καλύτερα χάσε και το Default Property γιατί η VBScript τα Default τα διαχειρίζεται με κάποιου είδους proxy (_Default) αν θυμάμαι καλά και μπορεί κάπου εκεί να έχεις πρόβλημα...

    Σου ξαναλέω δεν έχω ασχοληθεί με VB.NET και δεν έκατσα να το ψάξω τώρα οπότε μπορεί και να είμαι σε λάθος δρόμο...

    Αλλά για τσέκαρέ το...

    good luck
    rousso


    rousso
  •  30-08-2005, 13:14 4818 σε απάντηση της 4817

    Απ: Ερώτηση για περίεργη κλήση VBScript μέσα από VB.NET

    Smile [:)] Ooops!!! Με πρόλαβε ο pkanavos! Προφανώς έγραφα την ίδια ώρα με εκέινoν μόνο που το δικό μου post ήταν πιο φλύαρο και "άργησε" να τελειώσει...

    Smile [:)]

    Anyway o pkanavos έχει δίκιο για το CodeDOM...

    rousso

    rousso
  •  30-08-2005, 14:57 4823 σε απάντηση της 4817

    Απ: Ερώτηση για περίεργη κλήση VBScript μέσα από VB.NET

    Ευχαριστώ για το ενδιαφέρον σας.
    Λοιπόν για να γίνω πιο συγκεκριμενος. Ο ορισμός των properties είναι όπως φαίνεται παρακάτω:
    Default Public Overloads Readonly Property Item (byval index as Integer) as Field
    Default Public Overloads Readonly Property Item (byval index as Integer, byval IngoreError as boolean) as Field
    Default Public Overloads Readonly Property Item (byval tag as String, optional byval a as string = "",optional byval b as integer = 0 , optional byval IngoreError as boolean = false) as Field

    Και το κακό είναι οτι δεν μπορώ να αλλάξω τίποτα σε αυτό γιατί είναι κομμάτι του project εδώ και καιρό. Οπότε φαντάζεσαι τι θα γίνει αν αλλάξω κάτι...
    Warnings δεν έχω ...

    Εμένα με ενδιαφέρει η κλήση της 3ης υλοποίησης. Για τα optional arguments προσπάθησα να του τα δώσω όλα σαν να ήταν υποχρεωτικά αλλά πάλι μου βγάζει το error για λάθος στα ορίσματα κτλ... οπότε πιστεύω οτι προσπαθεί να καταλάβει τι είναι και τι θέλει η Item και το μόνο που καταφέρνει είναι να δεχτεί την πρώτη απλή εκδοχή της :
    Default Public Overloads Readonly Property Item (byval index as Integer) as Field

    Οι υπόλοιπες ... KIA ...
    Το καλύτερο ήταν που πήγα να του περάσω σαν πρώτο όρισμα string και το μετέτρεψε on the fly σε integer! Τα variants είναι αυτα?
    Msg.Fields.Item("2") και μου έφερε ότι θα έφερνε με την Msg.Fields.Item(2)...

    Τέλος μπορείς μάλλον να θεωρήσεις οτι το default δεν το αναγνωρίζει καν γιατί η κλήση :
    Msg.Fields(2)
    δεν παίζει καθόλου (με το ίδιο error).

    Τώρα κοιτάω τι μπορώ να κάνω με script σε VB.NET (σαν γλώσσα για το script δηλαδή), από το link που έγραψε ο pkanavos. Εκεί που φαντάζομαι οτι δεν θα έχω τέτοια προβλήματα ...

     

  •  30-08-2005, 15:14 4824 σε απάντηση της 4823

    Απ: Ερώτηση για περίεργη κλήση VBScript μέσα από VB.NET

    Η VBScript καταλαβαίνει μόνο Variants και δεν υποστηρίζει overloading, οπότε δεν μπορεί να δουλέψει αυτό που θες. Άσε που επειδή δουλεύει με late binding βάση του ονόματος, δεν υπάρχει περίπτωση να την πείσεις να επιλέξει άλλη συνάρτηση από αυτή που έχει ήδη επιλέξει. Υποθέτω ότι απλά επιλέγει την πρώτη συνάρτηση με το όνομα που ζητάς. Αυτή έτυχε να είναι η πρώτη, απλή συνάρτηση. Αναρωτιέμαι, αν άλλαζες τη σειρά ορισμού, θα προσπαθούσε να καλέσει άλλη συνάρτηση?

    Με λίγα λόγια, προσπαθείς να κάνεις τη VBScript να εκτελέσει κώδικα που δεν καταλαβαίνει. Καλά-καλά, η VB6 μπορεί να μην καταλάβαινε αυτό τον κώδικα, πόσο μάλλον η VBScript! Στην καλύτερη περίπτωση τα αποτελέσματα θα είναι απρόσμενα και τυχαία. Στη χειρότερη, θα έχεις ακατανόητα crash.

    Αν πρέπει οπωσδήποτε να περάσεις αυτές τις κλάσεις στη VBScript, θα πρέπει να τις ξανασχεδιάσεις έχοντας υπόψη τους κανόνες του COM Interoperability και να εγκαταλείψεις το overloading. Αν δεν μπορείς να το κάνεις αυτό, φτιάξε άλλες κλάσεις για το Interop που θα καλούν εσωτερικά αυτές που ήδη έχεις
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  30-08-2005, 16:09 4825 σε απάντηση της 4824

    Απ: Ερώτηση για περίεργη κλήση VBScript μέσα από VB.NET

    Νομίζω ότι την ΄λέξη κλειδί την είπε ο pkanavos: "να εγκαταλείψεις το overloading" γι αυτήν την περίπτωση...

    Άρα φτιάξε μια ρουτίνα που θα καλείς από VBScript και ονόμασέ την π.χ. vbsItem1. Βάλε την vbsItem1 να καλεί το σωστό overload της Item και να επιστρέφει το σωστό value. Αντίστοιχα φτιάξε μια vbsItem2 για το άλλο overload κ.ο.κ.

    Αυτός είναι ο πιο εύκολος τρόπος για να μην αλλάξεις το interface της Field Class...

    Αν θες να το κάνεις όμως πιο σωστά και ωραία... τότε κοίτα να το κάνεις χωρίς ScriptControl και COM...

    rousso
    rousso
  •  30-08-2005, 16:31 4828 σε απάντηση της 4825

    Απ: Ερώτηση για περίεργη κλήση VBScript μέσα από VB.NET

    ... wrapper class ΚΑΙ wrapper method σαν δύο διαφορετικές λύσεις και όλα παίζουν τέλεια.
    Αν δεν αρέσει σαν λύση (στα πάνω στρώματα της ιεραρχίας) θα παίξει και .NET scripting (ήδη παιδευω το παράδειγμα του MSDN)...
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems