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

 

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

Reflection από dll σε dll

Îåêßíçóå áðü ôï ìÝëïò pontifikas. Τελευταία δημοσίευση από το μέλος pontifikas στις 24-05-2006, 15:58. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-05-2006, 08:52 13131

    Reflection από dll σε dll

    Μου παρουσιάστηκε το έξης πρόβλημα:


    Έχω μια εφαρμογή που χρησιμοποιεί 2 dlls. Το ένα από αυτά έχει πολλές static μεταβλητές που χρησιμοποιεί το πρόγραμμα.
    και 2ο Dll.

    Tώρα.Μια συνάρτηση του 2ου dll, μέσω reflection, προσπαθεί να καλέσει την τιμή μιας μεταβλητής από το 1ο οι οποία έχει αλλαχθεί από την εφαρμογή.

    Το πρόβλημά μου είναι ότι με αυτόν τον τρόπο στην συνάρτηση δεν επιστρέφεται η τιμή που αυτή την στιγμή έχει η μεταβλητή, αλλά αυτήν με την οποία αρχικοποιείται στο dll.

    Πώς μπορώ να πετύχω τέτοια συνέπεια ώστε αν αλλάζω μια μεταβλητή από την εφαρμογή να μπορεί να την βλέπει το 2ο dll, και αν την αλλάζει το 2o dll, η αλλαγή αυτή να απεικονίζεται και στην εφαρμογή?
  •  23-05-2006, 08:58 13132 σε απάντηση της 13131

    Απ: Reflection από dll σε dll

    Να υποθέσω ότι όταν λες μεταβλητές εννοείς πεδία?
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  23-05-2006, 09:17 13134 σε απάντηση της 13132

    Απ: Reflection από dll σε dll

     pkanavos wrote:
    Να υποθέσω ότι όταν λες μεταβλητές εννοείς πεδία?

    Νομίζω (C oriented here Embarrassed [:$])
    πχ
     public static string[,] IF = new string[3, 100];
    public static string Var01
            {
                get { return IF[1, 11]; }
                set { IF[1, 11] = value; }
            }


    Εγώ ζητάω την Var01. Αλλά μπορεί και να ζητήσω την IF(κάποιά άλλη στιγμή).
  •  23-05-2006, 10:00 13148 σε απάντηση της 13134

    Απ: Reflection από dll σε dll

    Αυτό είναι property. Όταν ζητάς την τιμή ενός property, στην ουσία εκτελείς το get function. Για να σου επιστρέφει τις ίδιες τιμές με τις αρχικές, σημαίνει είτε ότι δεν έχει αλλάξει η τιμή του property είτε ότι δεν εκτελέστηκε το get, με άλλα λόγια, ότι δεν ζήτησες την τιμή του property. Ίσως έτσι όπως έχεις γράψει τον κώδικα, να κρατάει την αρχική τιμή αντί να καλεί ξανά το property. Μήπως μπορείς να γράψεις τον κώδικα που χρησιμοποιείς?

    Επίσης, σκέψου μήπως μια πιο απλή λύση κάνει τη δουλειά που θέλεις. Static properties, reflection κλπ μπερδεύουν πολύ την εφαρμογή. Μήπως θα μπορούσες να κάνεις την ίδια δουλειά ορίζοντας ένα interface και κάνοντας το implement σε διάφορες κλάσεις μέσα στα dll σου?
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  23-05-2006, 10:29 13150 σε απάντηση της 13131

    Απ: Reflection από dll σε dll

    Πως αλλάζεις τις τιμές στην εφαρμογή σου; Εννοώ ...

    string myVar = MyDll1Class.Var1;

    myVar += "kati prosthesa";

    ή

    MyDll1Class.Var1 += "kati prosthesa";

    Θεωρητικά μιλώντας πάντα, ο πρώτος τρόπος δε θα αλλάξει την τιμή του property.


    Angel
    O:]
  •  23-05-2006, 10:58 13155 σε απάντηση της 13134

    Απ: Reflection από dll σε dll

    Με τον 2ο τρόπο.

    Μόλις παίξω λίγο ακόμα θα κάνω και post λίγο κώδικα
  •  24-05-2006, 15:58 13259 σε απάντηση της 13155

    Απ: Reflection από dll σε dll

    Χμμ...Την βρήκα την λύση. Δεν έκανα load τα assembliesEmbarrassed [:$]Embarrassed [:$]
                string[] libraries = new string[2] { "Assembly1", "Assembly2" };
               
                Type myType = null;
                System.Reflection.MemberInfo myMember = null;
                System.Reflection.MemberInfo[] myMembers = null;
                Type[] _types = null;
                foreach (string source in libraries)
                {
                    try
                    {
                        //Φόρτωσε το dll(ή exe) με το όνομα από το Libraries
                        //Εαν δεν υπάρχει θα φάμε exception στην μούρη.
                        Assembly myassemply = Assembly.Load(source);
                        //Πάρε τα modules του assembly.
                        Module[] modules = myassemply.GetLoadedModules();
                        foreach (Module mod in modules)
                        {
                            //Μάζεψε όλες τις δομές από κάθε module
                            _types = mod.GetTypes();
                            foreach (Type t in _types)
                            {
                                //Για κάθε δομή
                                myType = t;
                                //Ψάξε το ζητούμενο.
                                myMembers = t.GetMember(vArg);
                                if (myMembers.Length != 0)
                                {
                                    found = true;
                                    break;
                                }
                                if (found) break;
                            }
                            if (found) break;
                        }
                    }
                    catch
                    {
                    }
                    if (found) break;
                }


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