Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126

    Reflection: Chiamata al metodo Main(string[] args), il controllo non ritorna all'app.

    In breve:
    Ho un programma Winform (ma anche se fosse una Console Application sarebbe la stessa cosa).
    Faccio il load di un assembly.
    Individuo un tipo. Il tipo che individuo è la classe Program.
    Invoco il metodo Main(string[] args).
    Il metodo statico Main(string[] args) finisce con un Application.Run(istanza di un FormPippo).

    Quando quindi dal mio programma faccio queste operazioni, la form FormPippo appare ma il controllo viene trasferito appunto a questo programma. Cioè non posso fare altre azioni sul mio programma perchè la console è come se non fosse attiva..
    Qualcuno ha una soluzione a questo problema?
    Vi faccio vedere il codice che utilizzo tenendo presente che il programma che richiama carica l'assembly e invoca il metodo main è una console application:

    codice:
     static void Main(string[] args)
            {
                Assembly assembly = Assembly.LoadFile(@"C:\Eseguibile.exe");
                Type t = assembly.GetType("Eseguibile.Program");
    
                object[] p = new object[] { new string[] { } };
                RunStaticMethod(t, "Main", p);
                Console.WriteLine("Pippo");
                Console.ReadLine();
    
            }
    
    
    
     public static object RunStaticMethod(System.Type t, string strMethod,
    object[] aobjParams)
            {
                BindingFlags eFlags =
                 BindingFlags.Static | BindingFlags.Public |
                 BindingFlags.NonPublic;
                return RunMethod(t, strMethod,
                 null, aobjParams, eFlags);
            }
    
            private static object RunMethod(System.Type t, string
     strMethod, object objInstance, object[] aobjParams, BindingFlags eFlags)
            {
                MethodInfo m;
                try
                {
                    m = t.GetMethod(strMethod, eFlags);
                    if (m == null)
                    {
                        throw new ArgumentException("Non esiste un metodo'" +
                         strMethod + "' per il tipo '" + t.ToString() + "'.");
                    }
    
                    //Appena viene richiamata questa riga l'applicazione parte ma il controllo si trasferisce su questa applicazione. In debug ad esempio non riesco ad andare oltre questa riga..
                    object objRet = m.Invoke(objInstance, aobjParams);
                    
    
                    return null;
                }
                catch
                {
                    throw;
                }
            }
    Voglio l'alt+s anche per FF

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non ho provato il tuo codice ma, finchè utilizzi un solo thread, mi sembra difficile che funzioni come pensi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    a dire il vero ci avevo pensato, non ho messo in pratica perchè ovviamente ci sono altre cose che devo fare e che non ho detto.. nel senso che dopo avert avviato questa applicazione devo recuperare dei dati.. ossia delle variabili, istanze di classi etc che durante il ciclo di vita dell'applicazione vengono modificate e che devo recuperare per poi trasferirle alla prima applicazione (quella che chiama la seconda attraverso reflection). Non sono quindi sicuro che se avvio un secondo thread possa riuscire a trasferire questi oggetti..
    Voglio l'alt+s anche per FF

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Per fare in modo che il tuo programma continui ad essere eseguito subito dopo aver fatto partire l'exe, allora devi usare un altro thread.

    Poi segue tutto il resto, ma è un'altra storia (abbastanza complessa, a prima vista ...)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    si si, infatti funziona..
    diciamo che, nello stesso thread, la storia del recupero della variabile che viene modificata a runtime nell'assembly caricato con reflection e recuperata nella prima applicazione funziona normalmente.. il problema è l'altro thread.. come suggerito da te, creando un altro thread la prima applicazione continua a funzionare.. adesso ho paura di provare il recuper della variabile
    Cmq adesso provo e ti faccio sapere..
    Voglio l'alt+s anche per FF

  6. #6
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    Sembra proprio funzionare nonstante l'altro thread, può darsi che essendo presente nello stesso appdomain i due thread riescono a comunicare..
    Voglio l'alt+s anche per FF

  7. #7
    Il problema, più che di isolamento (che non dovrebbe esserci, dato che, come dici tu, sono nello stesso appdomain), è di race conditions: se il programma non si aspetta che un altro thread vada a toccare le sue variabili potresti incorrere in dei problemi; se non le modifichi è difficile che questo abbia problemi, ma piuttosto è possibile che tu ottenga risultati errati.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    no a modificarle non le modifico, al massimo ne recupero i valori. E' proprio questo il prossimo step, infatti stò cercando di recuperare il valore di una variabile che non è a scope class purtroppo. Voglio dire che questa variabile si trova nello scope di un metodo. Diciamo che sono anche riuscito a recuperarla tramite MethodBody.LocalVariables, solo che non ho capito se la variabile recuperata contiene un valore o è semplicemente una descrizione della variabile visto che è di tipo LocalVariableInfo
    Voglio l'alt+s anche per FF

  9. #9
    Trovo difficile che ti possa restituire il valore di una variabile locale, poiché essa esiste solo mentre la procedura è in esecuzione, e ne possono esistere più copie se la procedura è ricorsiva.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    Originariamente inviato da MItaly
    Trovo difficile che ti possa restituire il valore di una variabile locale, poiché essa esiste solo mentre la procedura è in esecuzione, e ne possono esistere più copie se la procedura è ricorsiva.
    sai cosa, variabili statiche tutto ok.. variabili non statiche, non c'è nulla da fare
    Voglio l'alt+s anche per FF

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.