Καλησπέρα και συγχαρητήρια για τη δουλειά σας. Εδώ και μερικές μέρες αντιμετωπίζω ένα πρόβλημα και μετά από πολύ και άκαρπη προσπάθεια αποφάσισα να ζητήσω τη βοήθεια σας.
Σε μια εφαρμογή μου έχω χρησιμοποιήσει την τεχνολογία .Net Remoting. Το remote object επιστρέφει στον client σαν ένα MarshalByRefObject. Αυτό το MarshalByRefObject ανατίθεται σε ένα αντικείμενο αντίστοιχου interface και όλα παίζουν μια χαρά. Ο κώδικας (γραμμένος σε Delphi.Net) είναι ο παρακάτω...
GetServerComponentObject := Activator.GetObject(pType, pURL) as MarshalByRefObject;
tComp := GetServerComponentObject as IComp;
Πρόσφατα προέκυψε η ανάγκη η εφαρμογή να λειτουργεί και αυτόνομα, εκτελώντας στον client και τις λειτουργίες που εκτελούνται στον server.
Η πρώτη λύση που σκέφτηκα ήταν να φέρω στον client σαν ένα ανεξάρτητο dll το κομμάτι που εκτελείται στον server και να δημιουργήσω το object όχι με Activator.GetObject άλλα με Activator.CreateInstance. Το πρόβλημα που προκύπτει είναι ότι εφόσον το object δημιουργείται local τότε ο τύπος του δεν είναι MarshalByRefObject άλλα ο πραγματικός τύπος όπως ορίζεται στο dll. Εφόσον το interface έχει οριστεί και στο dll και στο exe, τότε γυρίζει λάθος “Specified Cast is not valid”. Ξέρω ότι μπορώ να ξεπεράσω το πρόβλημα είτε ενσωματώνοντας όλες τις λειτουργίες σε ένα assembly, είτε “σπάζοντας” το interface σε ξεχωριστό assembly, άλλα δεν θα το ήθελα αφού η εφαρμογή όπως είναι ήδη παίζει και αυτές οι αλλαγές θα επηρέαζαν τον κανονικό τρόπο λειτουργίας.
Επίσης, θα μπορούσα να ανοίξω ένα port στον client και να ακολουθήσω την ίδια δοκιμασμένη “συνταγή” άλλα ούτε αυτή θα ήταν αποδεκτή λύση, αφού το client θα πρέπει να έχει εγκατεστημένο και ενεργοποιημένο τον iis, πράγμα το οποίο δεν μπορώ να επιβάλλω.
Στην ουσία αυτό που θέλω είναι ένας τρόπος να κάνω κάτι σαν Activator.GetObject χωρίς url… Δεν ξέρω, όμως, αν κάτι τέτοιο είναι εφικτό.
Περιμένω τη βοήθεια σας και σας ευχαριστώ εκ των προτέρων....