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

 

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

Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

Îåêßíçóå áðü ôï ìÝëïò Sunburn. Τελευταία δημοσίευση από το μέλος Δημήτρης Γκανάτσιος στις 05-10-2007, 03:25. Υπάρχουν 16 απαντήσεις.
Σελίδα 1 από 2 (17 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-10-2007, 11:12 35733

    Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Αντιμετωπίζω ένα πρόβλημα το οποίο υποψιάζομαι πως δεν έιναι τόσο σπάνιο όσο η άκαρπη έρευνα στο Google θα υποδείκνυε.

    Χτίζω μια σχετικά απλή εφαρμογή WinForms σε VB.NET, με τις εξής ανάγκες/απαιτήσεις:

    1) Το object model της εφαρμογής θα πρέπει να είναι προσβάσιμο & χρησιμοποιήσιμο από αποιαδήποτε άλλη εφαρμογή.

    2) Θα πρέπει να είναι εφικτό, μέσω scripting από άλλη εφαρμογή, να ξεκινάει ένα καινούργιο instance της εφαρμογής αυτής (συμπεριλαμβανομένου και του GUI) και να κάνει οτιδήποτε υπαγορεύεται από το script, δηλ. ουσιαστικά "τηλεχειρισμός"/αυτοματισμός της εφαρμογής από άλλη 3rd-party εφαρμογή με τρόπο παρόμοιο με αυτό που π.χ. μπορούμε να χρησιμοποιήσουμε το MS Office ή το Google Earth.

    3) Σχετικό με το παραπάνω, να υπάρχει η ίδια δυνατότητα τηλεχειρισμού/αυτοματισμού αλλα αυτή τη φορά σε εφαρμογή η οποία βρίσκεται ήδη σε λειτουργία. Δηλ. να ξεκινά πρώτα η κύρια εφαρμογή, και μετά η δευτερεύουσα εφαρμογή ξεκινά και να μπορεί να εντοπίσει την πρωτεύουσα εφαρμογή και να έχει πρόσβαση στα in-memory αντικέιμενά της.

    Η πρώτη απαίτηση ικανοποιείται εύκολα: διαχωρίζω το object model της εφαρμογής σε ξεχωριστό DLL το οποίο χρησιμοποιείται από την πρωτεύουσα εφαρμογή και μπορεί εύκολα να εισαχθεί σε οποιαδήποτε άλλη εφαρμογή χρειαστεί.

    Η δεύτερη και τρίτη απαίτηση είναι πιο δύσκολες. Υποθέτω πως πρέπει να δημιουργήσω ένα public API που ουσιαστικά θα λειτουργεί ως προθάλαμος στις κλάσεις και μεθόδους/λειτουργίες στιςε  οποίες θα επιτρέψω εξωτερική πρόσβαση. Και το API  αυτό θα πρέπει να ρυθμιστεί με τέτοιο τρόπο ώστε να επιτρέπει αφενός remote εκκίνηση της εφαρμογής και αφετέρου πρόσβαση στα in-memory στοιχεία της ενώ βρίσκεται σε λειτουργία.

    Έχω αναζητήσει εκτενώς για παραδείγματα τέτοιας λειτουργικότητας αλλά χωρίς επιτυχία. Τα περισσότερα search hits αναφέρονται στην εκμετάλλευση υπαρχόντων API (είτε των Windows ή διαφόρων δημοφιλών προγραμμάτων) και όχι στην δημιουργία καινούργιων εκ του μηδενός.

    Συνεπώς, θα εκτιμούσα οποιαδήποτε βοήθεια στο πρόβλημα αυτό.
  •  02-10-2007, 12:05 35734 σε απάντηση της 35733

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Καλησπέρα Sunburn,

    υπάρχει ενα πολύ καλό άρθρο στο CodeProject εδώ που κάνει Live hook σε ένα application, και μπορεί να διαχειριστεί τα πάντα.

     Νομίζω ότι ειναι ενα καλό σημείο εκκινισης για να κάνεις αυτά που ζητάς

    Νάσος.


    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

  •  02-10-2007, 12:24 35735 σε απάντηση της 35733

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Για την εκτέλεση κάποιου script όπως απαιτείς στο 2) θα πρέπει, είτε να γράψεις δική σου scripting language ώστε να την διαβάζει το πρόγραμμα σου και να την κάνει Parse ή να δίνεις την δυνατότητα στον χρήστη να γράφει είτε C# είτε VB.Net και να χρησιμοποιήσεις το CodeDom και την δυνατότητα του Runtime Compile που σου δίνει το .Net ώστε να κάνεις compile τα κομμάτια κώδικα, και να εκτελείς τις εντολές. Καλό θα ήταν να γράψεις ένα πολύ καλό documentation για τις έτοιμες εντολές, για το πως μπορούν να τις καλέσουν κλπ κλπ.

    Για το 3) θα πρέπει να κοιτάξεις προς την μεριά του DDE, το οποίο άλλωστε είναι αυτό το οποίο χρησιμοποιεί και το Office. Εκεί θα μπορεί η μια εφαρμογή να "μιλήσει" με την άλλη on the fly και να στείλει/πάρει ότι δεδομένα θέλεις. Είναι σχετικά δύσκολη υλοποίηση, αλλά τουλάχιστον κάνει αυτό που θες (απο όσα έχω διαβάσει και κατάλαβα ότι γράφεις).


    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  02-10-2007, 12:32 35736 σε απάντηση της 35734

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Ευχαριστώ! Αυτό είναι όντως ενα πολύ ενδιαφέρον εργαλείο και θα το εξετάσω.

    Βλέπω όμως οτι αυτο παίρνει "χύμα" όλη την εφαρμογη (controls etc.). Δεν θα ήταν προτιμότερη η χρήση ενός public API ώστε να ορίζεις ακριβώς ποιά στοιχεία θα είναι προσβάσιμα εξωτερικά;
  •  02-10-2007, 12:33 35737 σε απάντηση της 35736

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Sunburn:
    Ευχαριστώ! Αυτό είναι όντως ενα πολύ ενδιαφέρον εργαλείο και θα το εξετάσω.

    Βλέπω όμως οτι αυτο παίρνει "χύμα" όλη την εφαρμογη (controls etc.). Δεν θα ήταν προτιμότερη η χρήση ενός public API ώστε να ορίζεις ακριβώς ποιά στοιχεία θα είναι προσβάσιμα εξωτερικά;

    Δεν σε "πιάνω". Για ποιο πράγμα μιλάς; Big Smile


    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  02-10-2007, 12:35 35738 σε απάντηση της 35737

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Απαντούσα στο link που παρέπεμψε ο Νάσος.

    H χρήση Runtime Compile που αναφέρεις, θα βοηθούσε πραγματικά αρκετά όσον αφορά την εκτέλεση ενός προ-αποφασισμένου "τυφλού" script. Όμως είναι επιθυμητό η 3rd-party εφαρμογή να μπορεί να διαβάζει τα in-memory objects της πρωτέυουσας εφαρμογής και αναλόγως να τα "πειράζει" on-the-fly (δηλαδή οι αποφάσεις να παίρνονται ουσιαστικά στην 3rd-party εφαρμογή, και η πρωτεύουσα εφαρμογή να λειτουργεί απλά σαν "I/O slave"). Απ'οτι γνωρίζω το runtime compilation δεν παρέχει αυτή την δυνατότητα, σωστά;
  •  02-10-2007, 12:42 35739 σε απάντηση της 35738

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Sunburn,
    Εφόσον έχεις access στην εφαρμογή, έχεις και σε όλες της Assemlies της Wink αρα, είναι στο χέρι σου να καλέσεις οτι θες, το link ειναι για να δεις πως κανει gain access σε μια εφαρμογή που τρέχει. Από εκεί και πέρα κανεις την δικία σου υλοποίηση.

    Νάσος


    "Success is the ability to go from one failure to another with no loss of enthusiasm."
    Winston Churchill

    "Quality means doing it right when no one is looking."
    Henry Ford

  •  02-10-2007, 13:10 35741 σε απάντηση της 35738

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Σκέπτομαι ενδεχομένως την χρήση .ΝΕΤ remoting για την εκπλήρωση της απαίτησης (μέχρι τώρα συνήθως χρησιμοποιούσα web services). Υποθέτω πως το remoting, εκτός από την έναρξη καινούργιου process, υποστηρίζει και την σύνδεση σε υπάρχον τρέχον process.
  •  02-10-2007, 13:11 35742 σε απάντηση της 35739

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Σε μία εφαρμογή που τρέχει μπορεί κανείς να έχει πρόσβαση και μέσω Remoting. Είναι πιο εύκολο από το να στήσει hooks σε ολόκληρη την εφαρμογή.

    Υπάρχουν πάντως και άλλες λύσεις:

    • Η τελευταία μόδα είναι να φτιάξει κανείς ένα Powershell provider για να μπορεί να κληθεί η εφαρμογή του από ένα Powershell script. Έτσι κι αλλιώς, από το Powershell μπορείς να καλέσεις κλάσεις .ΝΕΤ, το μόνο που του λείπει είναι η πρόσβαση σε μία εφαρμογή που ήδη εκτελείται.
    • Επίσης, τo .ΝΕΤ 3.5 περιλαμβάνει το System.Addin namespace για να διευκολύνει αυτά ακριβώς τα σενάρια. Δες το blog του CLR Addin Team .
    • Τέλος μπορείς να χρησιμοποιήσεις Remoting για να καλέσεις κάποιες κλάσεις της εφαρμογής που εκτελείται.

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-10-2007, 13:14 35743 σε απάντηση της 35742

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Ευχαριστώ! Θα δοκιμάσω όλες τις λύσεις αυτές, πιθανότατα ξεκινώντας απο το remoting μια και φαίνεται να καλύπτει τις ανάγκες πληρέστερα.
  •  02-10-2007, 13:31 35744 σε απάντηση της 35738

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Sunburn:
    ...Όμως είναι επιθυμητό η 3rd-party εφαρμογή να μπορεί να διαβάζει τα in-memory objects της πρωτέυουσας εφαρμογής και αναλόγως να τα "πειράζει" on-the-fly (δηλαδή οι αποφάσεις να παίρνονται ουσιαστικά στην 3rd-party εφαρμογή, και η πρωτεύουσα εφαρμογή να λειτουργεί απλά σαν "I/O slave"). ...


    Εμένα η απαίτηση σου (Ι/Ο Slave) μου θυμίζει λίγο δουλειά Server.
    Οι clients κάνουν instantiate μια κλάση του server η οποία περιέχει και κάποιες static var/s για να δίνει πληροφορίες για το ποίοι και πόσοι είναι "connected" με το server σου... κλπ κλπ.
    Δεν ξέρω αν ειμαι "μακρυά" από αυτό που ψάχνεις, αλλά μου φαίνειται πιο logical.Wink

    Nothing to declare...
  •  02-10-2007, 15:58 35748 σε απάντηση της 35742

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Παναγιώτης Καναβός:

    Σε μία εφαρμογή που τρέχει μπορεί κανείς να έχει πρόσβαση και μέσω Remoting. Είναι πιο εύκολο από το να στήσει hooks σε ολόκληρη την εφαρμογή.

    Υπάρχουν πάντως και άλλες λύσεις:

    • Η τελευταία μόδα είναι να φτιάξει κανείς ένα Powershell provider για να μπορεί να κληθεί η εφαρμογή του από ένα Powershell script. Έτσι κι αλλιώς, από το Powershell μπορείς να καλέσεις κλάσεις .ΝΕΤ, το μόνο που του λείπει είναι η πρόσβαση σε μία εφαρμογή που ήδη εκτελείται.
    • Επίσης, τo .ΝΕΤ 3.5 περιλαμβάνει το System.Addin namespace για να διευκολύνει αυτά ακριβώς τα σενάρια. Δες το blog του CLR Addin Team .
    • Τέλος μπορείς να χρησιμοποιήσεις Remoting για να καλέσεις κάποιες κλάσεις της εφαρμογής που εκτελείται.

     

    Απλά να συμπληρώσω τον Παναγιώτη:

    • Αν απαντάγαμε ένα χρόνο πριν αυτό το ερώτημα η απάντηση θα ήταν η χρήση της Visual Basic for Applications. Θα μπορούσες να χρησιμοποιήσεις την τεχνολογία στην WinForms εφαρμογή σου, αλλά η Microsoft έχει σταματήσει να παρέχει άδειες για την ανάπτυξη εφαρμογών σε αυτή την τεχνολογία από τον περασμένο Ιούλιο. Η Visual Basic for Applications έχει αντικατασταθεί πλέον από το Microsoft® Visual Studio® Tools for Applications (VSTA). Θα πρότεινα να δεις το video "VSTA Video: VSTA at a glance" που είναι στο blog του VSTA Team, να δεις πόσο κοντά είναι σε αυτό που θέλεις.

     

    George J.

     


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  02-10-2007, 16:16 35749 σε απάντηση της 35748

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Το κοίταζα σήμερα το πρωί το VSTA αλλά μετά είδα την τιμή. $50 ανά κομμάτι ή 5% στην τιμή του προϊόντος γι αυτό και δεν το πρότεινα.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-10-2007, 17:40 35752 σε απάντηση της 35749

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Χμ... πολύ αψυχολόγητο pricing.

    Θα σχολίαζα περί αλλαγής φρουράς στην Microsoft και liquidation, αλλά νομίζω ότι ο Joel Spolsky τα έχει πει καλύτερα από εμένα, κάποια χρόνια πριν.

    Μην αφήνετε τα media να σας "ταΐζουν"!
  •  02-10-2007, 21:47 35764 σε απάντηση της 35752

    Απ: Εξωτερική πρόσβαση (μέσω API?) σε up-and-running εφαρμογή WinForms

    Και για τους δύο απάντησαν: να δούμε το θέμα λίγο πιο λεπτομερειακά...

    Εφαρμογές που παρέχουν τέτοιες δυνατότητες δεν είναι εφαρμογές των €10 ή των €100. Νομίζω ότι η αξία per seat θα είναι πάνω από €500. Οπότε το $50, τι είναι το 7% της τιμής; Νομίζω ότι μπορεί να το καλύψει κάποιος. Παρόμοια και στις εγκαταστάσεις per server που απαιτείται το 5% μέχρι τις $100000 - δεν νομίζω ότι είναι πραγματικό να μιλάμε για άδεια server πάνω από €70000 στην Ελλάδα. Ουσιαστικά με το ενσωματώνεις κάτι τέτοιο σε μια εφαρμογή σου, πολλαπλασιάζεις την αξία της. Δεν νομίζω ότι το κόστος της άδειας είναι κάτι που δεν καλύπτεται από την τιμή του προϊόντος - σαν να λες ότι πουλάς ένα υβριδικό αυτοκίνητο και δεν θες να τσιμπήσεις την τιμή...

    Για μένα αξίζει πιο πολύ την προσοχή μου, τι θα πρέπει να αναπτύξω που να χρειάζεται αυτή την λειτουργικότητα, παρά τι πρέπει να πληρώσω για αυτή...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
Σελίδα 1 από 2 (17 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems