Problema con eseguibile da libreria C#

di il
19 risposte

Problema con eseguibile da libreria C#

Buongiorno,
sto sviluppando una libreria in C# che mi apra un eseguibile sempre C#(progetto console). Il problema è che l'eseguibile in questione mi si apre in background, quindi non vedo apparire la finestra della console. Qualcuno ha idea di come si possa avviare un processo in foreground? Ho provato diversi approcci, ma nessuno andato a buon fine.
Attualmente il mio codice è questo:

[DllImport("user32.dll")]
static extern bool SetForeGroundWindow(IntPtr hWnd);
private IntPtr handle;


public void ProcAutomaticInst(int nInstanceNo, int nTokenNo, string bstrTenant, string bstrParams)
{
try
{


TheServer server = new TheServer();
server.Connect(TheClientType.CustomApplication);

//create a TheWFInstance object and load the workflow item by using the instance number
TheWFInstance wfInstance = new TheWFInstance();
wfInstance.Load(server, nInstanceNo);



//richiamo un applicazione esterna
Process.Start(@"C:\Users\Administrator\Desktop\Dll_Workflow\Dll_Workflow\Dll_Workflow\bin\Debug\HelloWorld.bat");
handle = p.MainWindowHandle;
SetForeGroundWindow(handle);

Ringrazio in anticipo per qualsiasi consiglio.

19 Risposte

  • Re: Problema con eseguibile da libreria C#

    La questione non è chiara. Tu stai eseguendo un batch (file .bat) non un eseguibile.
  • Re: Problema con eseguibile da libreria C#

    oregon ha scritto:


    La questione non è chiara. Tu stai eseguendo un batch (file .bat) non un eseguibile.
    Si, effettivamente in questo esempio richiamo un batch file che a sua volta contiene le istruzioni per avviare l'eseguibile. Il batch file l'ho provato e funziona correttamente. Ho optato per la soluzione con batch file perchè quando ho provato direttamente a richiamare l'eseguibile non vedevo nessun risultato. In ogni caso, vedo che mi avvia l'altra applicazione che mi rimane sempre in background. Io mi aspetto in pratica che si apra una finestra di console con scritto Hello World!
  • Re: Problema con eseguibile da libreria C#

    silentbass24 ha scritto:


    oregon ha scritto:


    La questione non è chiara. Tu stai eseguendo un batch (file .bat) non un eseguibile.
    Si, effettivamente in questo esempio richiamo un batch file che a sua volta contiene le istruzioni per avviare l'eseguibile. Il batch file l'ho provato e funziona correttamente. Ho optato per la soluzione con batch file perchè quando ho provato direttamente a richiamare l'eseguibile non vedevo nessun risultato. In ogni caso, vedo che mi avvia l'altra applicazione che mi rimane sempre in background. Io mi aspetto in pratica che si apra una finestra di console con scritto Hello World!
    Ho provato anche semplicemente ad utilizzare l'istruzione
    Process.Start("chrome.exe");
    ma non sortisce alcun effetto. Tutto questo si verifica nella libreria, perchè ho provato a fare la stessa cosa in una normale applicazione C# e il tutto funziona correttamente.
  • Re: Problema con eseguibile da libreria C#

    Ciao

    Quando sei su un'applicazione e ne esegui un'altra, è normale che questa venga eseguita in background, o meglio che NON sia la finestra principale.

    Ho fatto diverse volte quello che ti serve, però non ho sotto mano il codice.
    Il principio è abbastanza semplice:
    - Esegui la tua app passando dalla classe Process
    - Attendi qualche istante (tempo che parta il processo). Se ricordo bene c'è anche un metodo della classe Process che ti restituisce quando il processo è stato correttamente avvisato ed è partita anche la sessione grafica
    - Dal process pendi la finestra principale (MainWin)
    - Tramite apposite call a delle dll di Windows poi dire di portare in foreground la finestra di cui al punto precedente


    Con questo dovresti riuscire a fare tutto
  • Re: Problema con eseguibile da libreria C#

    PiGi78 ha scritto:


    Ciao

    Quando sei su un'applicazione e ne esegui un'altra, è normale che questa venga eseguita in background, o meglio che NON sia la finestra principale.

    Ho fatto diverse volte quello che ti serve, però non ho sotto mano il codice.
    Il principio è abbastanza semplice:
    - Esegui la tua app passando dalla classe Process
    - Attendi qualche istante (tempo che parta il processo). Se ricordo bene c'è anche un metodo della classe Process che ti restituisce quando il processo è stato correttamente avvisato ed è partita anche la sessione grafica
    - Dal process pendi la finestra principale (MainWin)
    - Tramite apposite call a delle dll di Windows poi dire di portare in foreground la finestra di cui al punto precedente


    Con questo dovresti riuscire a fare tutto
    Grazie, sto provando a tradurre il tutto in codice, ma ad essere sincero sono in difficoltà (tanta inesperienza). Non sto riuscendo a risalire ai metodi indicati.
  • Re: Problema con eseguibile da libreria C#

    Non usare il batch ma direttamente l'eseguibile. È chiaro che se l'eseguibile termina non vedrai nulla a meno che non attenda un input
  • Re: Problema con eseguibile da libreria C#

    oregon ha scritto:


    Non usare il batch ma direttamente l'eseguibile. È chiaro che se l'eseguibile termina non vedrai nulla a meno che non attenda un input
    Grazie,
    l'eseguibile che sto tentando di far partire è semplicemente questo:

    Console.WriteLine("Hello World");
    Console.Read();

    avevo aggiunto il read proprio perchè attendesse un mio input. E' sbagliato come ragionamento?
  • Re: Problema con eseguibile da libreria C#

    Ho creato

    una libreria di classi
    un semplice programma console chiamato in un metodo della classe
    un programma di test che usa la libreria

    e funziona regolarmente, visualizzando la finestra console.

    A questo punto non so se la Process.Start venga eseguita nel tuo codice, essendoci altre linee prima di cui non si sa nulla (magari non arriva alla Process.Start per una eccezione).

    Prova a fare un test con un esempio base (come l'ho fatto io) e lancia direttamente l'eseguibile.
  • Re: Problema con eseguibile da libreria C#

    Ho provato a scrivere al volo un metodo di esempio.
    L'ho testato con Notepad e mi funziona, poi vedi te se va col tuo eseguibile (exe diretto, non bat)
    
    
            /// <summary>
            /// Manda in esecuzione un file eseguibile
            /// </summary>
            /// <param name="exePath">Path dell'eseguibile</param>
            private void RunExe(string exePath)
            {
                // Verifichiamo i parametri
                if (string.IsNullOrEmpty(exePath)) throw new ArgumentNullException(nameof(exePath));
                if (!File.Exists(exePath)) throw new FileNotFoundException("File to execute not found", exePath);
    
                // Avvio del processo (puoi impostare tutti i parametri che ti servono)
                var process = Process.Start(new ProcessStartInfo
                {
                    FileName = exePath,
                    WindowStyle = ProcessWindowStyle.Maximized,
                    CreateNoWindow = true
                });
    
                // Attendiamo che si avvii la finestra, massimo 2 secondi
                process.WaitForInputIdle(2000);
    
                // Prendiamo la main window
                var mainWin = IntPtr.Zero;
                while (mainWin == IntPtr.Zero)
                {
                    if (process.HasExited) break;
                    mainWin = process.MainWindowHandle;
                }
    
                // La rendiamo visibile
                if (mainWin != IntPtr.Zero)
                {
                    SetForegroundWindow(mainWin);
                }
            }
    
    
            // Funzione per impostare la finestra di foreground
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool SetForegroundWindow(IntPtr hWnd);
    
    
    
  • Re: Problema con eseguibile da libreria C#

    oregon ha scritto:


    Ho creato

    una libreria di classi
    un semplice programma console chiamato in un metodo della classe
    un programma di test che usa la libreria

    e funziona regolarmente, visualizzando la finestra console.

    A questo punto non so se la Process.Start venga eseguita nel tuo codice, essendoci altre linee prima di cui non si sa nulla (magari non arriva alla Process.Start per una eccezione).

    Prova a fare un test con un esempio base (come l'ho fatto io) e lancia direttamente l'eseguibile.
    Grazie.
  • Re: Problema con eseguibile da libreria C#

    PiGi78 ha scritto:


    Ho provato a scrivere al volo un metodo di esempio.
    L'ho testato con Notepad e mi funziona, poi vedi te se va col tuo eseguibile (exe diretto, non bat)
    
    
            /// <summary>
            /// Manda in esecuzione un file eseguibile
            /// </summary>
            /// <param name="exePath">Path dell'eseguibile</param>
            private void RunExe(string exePath)
            {
                // Verifichiamo i parametri
                if (string.IsNullOrEmpty(exePath)) throw new ArgumentNullException(nameof(exePath));
                if (!File.Exists(exePath)) throw new FileNotFoundException("File to execute not found", exePath);
    
                // Avvio del processo (puoi impostare tutti i parametri che ti servono)
                var process = Process.Start(new ProcessStartInfo
                {
                    FileName = exePath,
                    WindowStyle = ProcessWindowStyle.Maximized,
                    CreateNoWindow = true
                });
    
                // Attendiamo che si avvii la finestra, massimo 2 secondi
                process.WaitForInputIdle(2000);
    
                // Prendiamo la main window
                var mainWin = IntPtr.Zero;
                while (mainWin == IntPtr.Zero)
                {
                    if (process.HasExited) break;
                    mainWin = process.MainWindowHandle;
                }
    
                // La rendiamo visibile
                if (mainWin != IntPtr.Zero)
                {
                    SetForegroundWindow(mainWin);
                }
            }
    
    
            // Funzione per impostare la finestra di foreground
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool SetForegroundWindow(IntPtr hWnd);
    
    
    
    Ora provo il codice, appena ho qualche riscontro ti aggiorno. Grazie mille
  • Re: Problema con eseguibile da libreria C#

    silentbass24 ha scritto:


    PiGi78 ha scritto:


    Ho provato a scrivere al volo un metodo di esempio.
    L'ho testato con Notepad e mi funziona, poi vedi te se va col tuo eseguibile (exe diretto, non bat)
    
    
            /// <summary>
            /// Manda in esecuzione un file eseguibile
            /// </summary>
            /// <param name="exePath">Path dell'eseguibile</param>
            private void RunExe(string exePath)
            {
                // Verifichiamo i parametri
                if (string.IsNullOrEmpty(exePath)) throw new ArgumentNullException(nameof(exePath));
                if (!File.Exists(exePath)) throw new FileNotFoundException("File to execute not found", exePath);
    
                // Avvio del processo (puoi impostare tutti i parametri che ti servono)
                var process = Process.Start(new ProcessStartInfo
                {
                    FileName = exePath,
                    WindowStyle = ProcessWindowStyle.Maximized,
                    CreateNoWindow = true
                });
    
                // Attendiamo che si avvii la finestra, massimo 2 secondi
                process.WaitForInputIdle(2000);
    
                // Prendiamo la main window
                var mainWin = IntPtr.Zero;
                while (mainWin == IntPtr.Zero)
                {
                    if (process.HasExited) break;
                    mainWin = process.MainWindowHandle;
                }
    
                // La rendiamo visibile
                if (mainWin != IntPtr.Zero)
                {
                    SetForegroundWindow(mainWin);
                }
            }
    
    
            // Funzione per impostare la finestra di foreground
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool SetForegroundWindow(IntPtr hWnd);
    
    
    
    Ora provo il codice, appena ho qualche riscontro ti aggiorno. Grazie mille
    Ho provato il codice, al momento ci sto lavorando su perché la riga "process.WaitForInputIdle(2000);" mi genera un'ccezione. Ho provato a commentarla ed il processo comunque mi si genera in backgroud.
  • Re: Problema con eseguibile da libreria C#

    Prova a creare un progettino di test in cui replichi il problema e magari ce lo fai scaricare.
  • Re: Problema con eseguibile da libreria C#

    oregon ha scritto:


    Prova a creare un progettino di test in cui replichi il problema e magari ce lo fai scaricare.
    Ho fatto un progettino, invece di crearlo come DLL l'ho creato come applicazione, a parte la parte del WaitForInputIdle che ho commentato, ho visto che funziona correttamente e mi ha aperto l'eseguibile. A quanto pare il problema risiede nel processo al quale associo la libreria. Purtroppo si tratta di un'applicazione con il suo server e onestamente non saprei come replicare l'errore. Ora guarderò la documentazione per tentare di approfondire la questione. Grazie per l'aiuto, mi è stato molto utile.
Devi accedere o registrarti per scrivere nel forum
19 risposte