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

 

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

.net DLL calling from DELPHI vcl

Îåêßíçóå áðü ôï ìÝëïò Bill . Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 15-09-2016, 17:23. Υπάρχουν 11 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-09-2016, 12:45 77797

    .net DLL calling from DELPHI vcl

        Καλημέρα

    Θέλω να φτιάξω ένα DLL C# .net 4 (το έχω φτιάξει ήδη) ωστόσο θέλω να το καλέσω μέσα από περιβάλλον Delphi. Εκεί διαπίστωσα ότι θα πρέπει από managed dll που παράγει το .net να το κάνω pe DLL. Η ερώτηση μου είναι απλή. Πως το κάνω αυτό με απλά βήματα ?

    Είδα σε κάποια forums αλλά δε πολύ κατάλαβα.

    Ευχαριστώ 


    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  02-09-2016, 17:40 77798 σε απάντηση της 77797

    Απ: .net DLL calling from DELPHI vcl

    Καλησπέρα σου,

    Αν θυμάμαι καλά για να το δεις από την Delphi θα πρέπει να φτιάξεις ένα COM Wrapper για το .NET component σου. Θα πρότεινα να ξεκινήσεις από τα παρακάτω threads:

    • Form.NET ΣΕ VB6 (http://www.dotnetzone.gr/cs/forums/thread/3420.aspx)
    • Φτιάχνοντας ένα COM Wrapper για ένα .NET Component (http://www.dotnetzone.gr/cs/forums/thread/1358.aspx)
     
    George J. 

    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  03-09-2016, 22:23 77799 σε απάντηση της 77798

    Απ: .net DLL calling from DELPHI vcl

    Βρήκα ένα επίσης χρήσιμο url http://forums.devshed.com/delphi-programming-90/dll-delphi-231122.html

      


    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  11-09-2016, 20:48 77812 σε απάντηση της 77798

    Απ: .net DLL calling from DELPHI vcl

       Ξανά επιστρέφω γιατί σε όσες λύσεις βρήκα απαιτούν να κάνα regasm dll. Μήπως γνωρίζει κανείς αν μπορώ να κάνω ένα unmanaged dll σε C++ το οποίο θα καλεί ένα .net DLL managed χωρίς να απαιτεί να κάνω regasm ? Γενικά ψάχνω να καλέσω ένα managed dll .net μέσα από μια άλλη γλώσσα πχ Delphi ή C++ (βάζω και την C++ μήπως μπορώ να κάνα μια ενδιάμεση γέφυρα μεταξύ C# και Delphi)

     


    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  12-09-2016, 13:00 77813 σε απάντηση της 77812

    Απ: .net DLL calling from DELPHI vcl

    An to .net Dll to ftiaxeis me C++/CLI anti sketi C# ginetai xoris na kaneis COM register. 

    H an ftiaxeis ena C++/CLI wrapper tou .net dll. 

    http://pragmateek.com/using-c-from-native-c-with-the-help-of-ccli-v2/ 

  •  12-09-2016, 19:11 77814 σε απάντηση της 77812

    Απ: .net DLL calling from DELPHI vcl

    Bill :
    Ξανά επιστρέφω γιατί σε όσες λύσεις βρήκα απαιτούν να κάνα regasm dll. Μήπως γνωρίζει κανείς αν μπορώ να κάνω ένα unmanaged dll σε C++ το οποίο θα καλεί ένα .net DLL managed χωρίς να απαιτεί να κάνω regasm ? Γενικά ψάχνω να καλέσω ένα managed dll .net μέσα από μια άλλη γλώσσα πχ Delphi ή C++ (βάζω και την C++ μήπως μπορώ να κάνα μια ενδιάμεση γέφυρα μεταξύ C# και Delphi)

    Αρχικά το regasm δεν είναι .dll είναι command-line utility - δες εδώ: https://msdn.microsoft.com/en-us/library/tzat5yw6(v=vs.110).aspx. Στον υπολογιστή μου είναι μέσα στο "C:\Windows\Microsoft.NET\Framework64\v4.0.30319" οπότε εκεί είναι και στον δικό σου.

    Όσο σε πιο "παλιές" γλώσσες πηγαίνεις χάνεις τους "αυτοματισμούς" και τις ευκολίες σου - δεν θα είναι πιο εύκολο, θα είναι πιο πολύπλοκο να κάνεις μια τέτοια γέφυρα.

      

     George J.


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

    Απ: .net DLL calling from DELPHI vcl

       Έχεις δίκιο, αλλά δε θέλω να τρέχω σε κάθε client regasm (έστω και μια φορά μόνο) αν υπάρχει τρόπος να το αποφύγω. Αλλά αν γίνει όντως πολύ πολύπλοκο τότε θα αναγκαστώ να τρέχω το regasm...


     


    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  12-09-2016, 19:48 77816 σε απάντηση της 77815

    Απ: .net DLL calling from DELPHI vcl

    Bill :
     Έχεις δίκιο, αλλά δε θέλω να τρέχω σε κάθε client regasm (έστω και μια φορά μόνο) αν υπάρχει τρόπος να το αποφύγω. Αλλά αν γίνει όντως πολύ πολύπλοκο τότε θα αναγκαστώ να τρέχω το regasm..

    Δεν τρέχεις σε κάθε client το regasm - το regasm το τρέχεις μία φορά στο developer μηχάνημα και σου φτιάχνει το .tlb. Από εκεί και πέρα το πως θα γίνει το .tlb register στο client, είναι ο ίδιος τρόπος με κάθε COM component. Το σύνηθες είναι να στο κάνει register ο installer που θα έχεις για την εφαρμογή. Κανένα component που είναι COM δεν είναι απλά το κάνω copy και παίζει...

     

    George J.

     


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

    Απ: .net DLL calling from DELPHI vcl

       Για την ιστορία του  topic βρήκα λύση χωρίς να κάνω C++ γέφυρα ή να κάνω registry το com. Η λύση σε αυτό εδώ το url https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports.

     Τώρα όσον αφορά το θέμα να μην κάνω register το .tlb μου γλυτώνει από σενάρια του τύπου : Αν έχω ένα μηχάνημα με πολλούς users και κάνει ένας από τους χρήστες uninstall την εφαρμογή μου, θα κάνει και unregister το com object μου και θα έχουν όλοι οι χρήστες πρόβλημα. Ή θα έπρεπε κάθε φορά στον κώδικα να κάνω register το συγκεκριμένο com. anyway επειδή δεν ήθελα να μπλέξω με τέτοιου είδους σενάρια θεωρώ καλύτερη λύση την απλούστερη.

     Ευχαριστώ για τις συμβουλές όλων σας 


    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  15-09-2016, 16:56 77819 σε απάντηση της 77818

    Απ: .net DLL calling from DELPHI vcl

    Δυστυχώς, πέτυχες το αντίθετο. *Τώρα* όποιος χρήστης βγάλει την εφαρμογή θα έχουν πρόβλημα όλοι οι χρήστες. Εκτός και αν εγκαθιστάς την εφαρμογή στο Documents ή κάποιο άλλο folder το οποίο είναι ακατάλληλο για εγκατάσταση προγραμμάτων.

    Τα Windows υποστηρίζουν per-machine ή per-user εγκατάσταση εξαπανέκαθεν. Μόνο ένας administrator μπορεί να βάλει ή βγάλει μία εφαρμογή για *όλους* τους χρήστες. Αυτό κάνει η επιλογή που βλέπεις στους διάφορους installers για εγκατάσταση σε όλους τους χρήστες.  

    Aπό τα Windows 7 και μετά μάλιστα, οι εφαρμογές που εγκαθιστούν οι χρήστες ως Per-User πάνε στο προσωπικό folder του κάθε χρήστη μέσα στο %LocalAppData%\Programs. 

    Τα COM registrations έχουν reference count και δεν βγαίνουν αν δεν απεγκατασταθεί και η *τελευταία* εφαρμογή που τα χρησιμοποιεί. Αυτό έγινε ακριβώς για να αποφευχθεί το πρόβλημα να *απεγκατασταθεί ή διαγραφεί το DLL* και έτσι να σκάσουν όλες οι άλλες εφαρμογές και χρήστες. Επιπλέον, με το COM δεν υπάρχει ασάφεια για το τι ακριβώς τύπους θέλει η κάθε μέθοδος. Η Delphi μπορεί να δημιουργήσει τους αντίστοιχους τύπους απλά κοιτάζοντας το tlb. Αντίθετα, με χύμα functions θα πρέπει να φτιάξεις με το χέρι τύπους που θα ταιριάζουν ακριβώς σε αυτά που περιμένει η βιβλιοθήκη. Αν το παραμικρό πάει στραβά, θα φας κατευθείαν Access Violation χωρίς εξήγηση.

    Όσο για το blog, αυτά θα τα έβρισκες και στο documentation του P/Invoke. Πχ. το πρώτο αποτέλεσμα ψάχνοντας για "C# P/Invoke"  είναι το "Platform Invoke Tutorial" στο https://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx . Υπέθεσα ότι για να ρωτάς πως να καλέσεις .NET από Delphi το είχες ήδη κοιτάξει.

    Όπως και να έχει, η χρήση COM είναι ευκολότερη και ασφαλέστερη, ακριβώς επειδή δεν υπάρχει ασάφεια στις κλήσεις και επειδή είναι δυσκολότερο να χαθούν DLL επειδή σβήστηκαν κατά τύχη. 


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  15-09-2016, 17:05 77820 σε απάντηση της 77819

    Απ: .net DLL calling from DELPHI vcl

    To P/Invoke einai gia na kaleis unmanaged apo .NET. O xristis zitaei to antitheto (na kalei .NET apo unmanaged).
  •  15-09-2016, 17:23 77821 σε απάντηση της 77820

    Embarrassed [:$] Απ: .net DLL calling from DELPHI vcl

    Δίκιο έχεις Confused, έχω αιώνες να κάνω κάτι τέτοιο και ξέχασα. Βλέπω μάλιστα ότι δεν αναφέρεται καν η χρήση .ΝΕΤ από unmanaged κώδικα στο "Interoperability Overview" . Παλιά το λέγανε άτυπα "Reverse PInvoke", οπότε μάλλον γι αυτό τα μπέρδεψα.

    Για να γίνει κληθεί .NET assembly από C ή Delphi πρέπει να προστεθεί ένα NuGet package το οποίο μεταξύ άλλων ... κάνει host το ίδιο το CLR μέσω COM. Διαφορετικά οι κλήσεις για το CLR hosting πρέπει να γίνουν από την ίδια την εφαρμογή.

    Σίγουρα *δεν* είναι η πιο απλή λύση.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems