IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Lancement et communication avec une archive java depuis une appli C#


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2020
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2020
    Messages : 31
    Par défaut Lancement et communication avec une archive java depuis une appli C#
    Bonjour,
    Je suis actuellement en train de créer une application en C# sur Microsoft Visual Studio. Dans le même répertoire que l'application, il y a une archive java exécutable qui fonctionne correctement (je l'ai testé auparavant) mais également un .exe qui lance l'archive .jar avec cette commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -Xmx1024M -Xms1024M -jar #####.jar
    où ##### est le nom de mon archive.
    Lors de l'exécution de ce .exe, je peux contrôler l'archive .jar avec des commandes et elle peut me répondre. Me vient alors une idée : puisque j'ai besoins de lancer et communiquer avec cette archive .jar, pourquoi ne pas lancer l'archive depuis la console de l'application en C# avec la commande citée précédemment ?
    Pour l'instant, le code que j'utilise est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private void StartArchivejar_button(object sender, EventArgs e)
            {
                Console.WriteLine("java - Xmx1024M - Xms1024M - jar server.jar");
            }
    J'ai beau chercher, je ne trouve aucune solution le permettant puisque lors de l'exécution de la commande, la ligne est écrite mais rien ne se passe.

    Est-ce possible ? Et si oui, Que puis-je faire pour que cela marche ?

    Merci.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    process.Start
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2020
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2020
    Messages : 31
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    process.Start
    Merci mais... non.
    En effet, je voudrais pouvoir donner des instruction en tant réel et pouvoir lire les lignes écrites par l'exécutable java externe.
    Je recherche depuis des semaines et je suis tombé sur ce code un peu avant de revenir voir cette discutions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    namespace ServeurApp
    {
        static class Program
        {
            /// <summary>
            /// Point d'entrée principal de l'application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    #if DEBUG
                CreateConsole();
    #endif
                Application.Run(new Menu());
            }
     
            static void CreateConsole()
            {
                var t = new System.Threading.Thread(() => {
                    AllocConsole();
                    for (; ; )
                    {
                        var cmd = Console.ReadLine();
                        if (cmd.ToLower() == "quit") break;
     
                    }
                    FreeConsole();
     
                });
                t.IsBackground = true;
                t.Start();
            }
            [System.Runtime.InteropServices.DllImport("kernel32.dll")]
            private static extern bool AllocConsole();
            [System.Runtime.InteropServices.DllImport("kernel32.dll")]
            private static extern bool FreeConsole();
        }
     
    }
    Malheureusement, la console de mon application ne prend pas en charge les commandes Windows.

    Donc je pose une autre question, comment exécuter des commandes Windows depuis une console C# ?
    Merci.

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    via process.start il est possible de récupérer la sortie console de l'application démarrée, et à priori d'envoyer de l'input aussi
    Process.StandardOutput Propriété (System.Diagnostics) | Microsoft Docs
    Process.StandardInput Propriété (System.Diagnostics) | Microsoft Docs
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2020
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2020
    Messages : 31
    Par défaut
    Encore merci mais... toujours pas.
    En effet, lors de l'exécution de mon programme, j'ai bien le .jar qui s'ouvre mais aucune trace de logs sur mon Process. (mais bon, on avance )
    Comme a mon habitude, je vous fournit le code utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    private void Start()
            {
                this.Worlds_Listbox.SelectedItem = this.Worlds_Listbox.CheckedItems[0];
                GenerationOfMap(this.Worlds_Listbox.Text.Insert(0, "Worlds_Examples/"), "World");
     
                using (Process console = new Process())
                {
                    console.StartInfo.FileName = "cmd.exe";
                    console.StartInfo.UseShellExecute = false;
                    console.StartInfo.RedirectStandardInput = true;
                    console.StartInfo.RedirectStandardOutput = true;
     
                    console.Start();
     
                    StreamWriter instructions = console.StandardInput;
                    StreamReader lecteur = console.StandardOutput;
     
                    instructions.WriteLine("java -Xmx1024M -Xms1024M -jar server.jar");
     
                }
     
     
            }
    Voici ce que j'ai :
    Nom : not cool.png
Affichages : 358
Taille : 161,1 Ko

    Et ce que j'aurais du avoir :

    Nom : cool.png
Affichages : 342
Taille : 208,2 Ko

    (j'en profite pour préciser que mon applis bug complètement la console qui ne va pas jusqu'à son
    [##:##:## INFO]: Done (###) ! For help, type "he...
    Ce qui ne va pas du tout.

    J'apprécie le temps que vous prenez pour moi. Je ne cherche pas à vous contredire tout le temps , c'est juste que j'aimerais pourvoir finir cette application avant les vacances (4sem) C'est la seule chose qui n'est pas terminée (la console).


    PS : désolé pour les images trop grandes.

  6. #6
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2020
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2020
    Messages : 31
    Par défaut Fini ?
    Bonjour, J'ai réussi à corriger l'erreur de la dernière fois.
    Depuis la création de la discussion, vous m'avez aidé à résoudre un tas de problèmes. Sincèrement, .
    (Mais il me reste encore un problème )
    Bon, je ne vais pas tourner en rond bien longtemps, le voici :
    J'ai bien les exécutables .exe et .jar qui s'ouvrent.
    Génial ! Encore Merci.
    Mais au niveau de la com, c'est pas encore ça. J'ai codé ces lignes pour le démarrage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void Start()
            {
                this.Worlds_Listbox.SelectedItem = this.Worlds_Listbox.CheckedItems[0];
                GenerationOfMap(this.Worlds_Listbox.Text.Insert(0, "Worlds_Examples/"), "World/");
                using (Process process = new Process())
                {
                    string file = "serveur.bat";
                    process.StartInfo.UseShellExecute = false;
                    process.StartInfo.WorkingDirectory = Path.GetFullPath(file).Remove(Path.GetFullPath(file).Length - file.Length, file.Length);
                    process.StartInfo.FileName = file;
     
                    process.Start();
            }
    Et pour communiquer, j'ai rajouté ces lignes après
    process.Start();
    .
    Les voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     StreamReader reader = process.StandardOutput;
                for (; ; )
                    {
                        string output = reader.ReadLineAsync().ToString();
                        MessageBox.Show(output);
                    }
    Malheureusement, j'obtient cette erreur :
    System.InvalidOperationException
    HResult=0x80131509
    Message=StandardOut n'a pas été redirigé ou le processus n'a pas encore commencé.
    Source=System
    Arborescence des appels de procédure*:
    à System.Diagnostics.Process.get_StandardOutput()
    à ServeurApp.ServerApp.Start() dans H:\Oliv73\Docs\PROG\C#\Serveur Minecraft\ServeurApp\ServeurApp\ServeurApp.cs :ligne 168
    à ServeurApp.ServerApp.StartButton_Click(Object sender, EventArgs e) dans H:\Oliv73\Docs\PROG\C#\Serveur Minecraft\ServeurApp\ServeurApp\ServeurApp.cs :ligne 119
    à System.Windows.Forms.Control.OnClick(EventArgs e)
    à System.Windows.Forms.Button.OnClick(EventArgs e)
    à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    à System.Windows.Forms.Control.WndProc(Message& m)
    à System.Windows.Forms.ButtonBase.WndProc(Message& m)
    à System.Windows.Forms.Button.WndProc(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    à System.Windows.Forms.Application.Run(Form mainForm)
    à ServeurApp.Program.Main() dans H:\Oliv73\Docs\PROG\C#\Serveur Minecraft\ServeurApp\ServeurApp\Program.cs :ligne 20

    Cette exception a été levée à l'origine dans cette pile des appels*:
    [Code externe]
    ServeurApp.ServerApp.Start() dans ServeurApp.cs
    ServeurApp.ServerApp.StartButton_Click(object, System.EventArgs) dans ServeurApp.cs
    [Code externe]
    ServeurApp.Program.Main() dans Program.cs
    sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StreamReader reader = process.StandardOutput;
    Une idée ?
    Merci

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    dans le code que tu mets sur le dernier post il n'y a pas redirect machin = true
    et c'est nécessaire pour pouvoir lire la propriété StandardOutput

    Process.StandardOutput Propriété (System.Diagnostics) | Microsoft Docs
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2020
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2020
    Messages : 31
    Par défaut
    Bonjour,
    Oui effectivement, j'avais oublié cette ligne.
    Mais ça ne marche toujours pas.
    Lors de l'exécution du programme, une messageBox s'ouvre avec :
    System.Threading.Tasks.Task 1[System.String]
    Et cela à l'infini.
    C'est le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for( ; ; ){
                        string output = reader.ReadLineAsync().ToString();
                        MessageBox.Show(output);
    }
    qui le fait s'ouvrir à l'infini mais il n'est pas censé écrire le message ci dessus non ?

    Et au démmarage, j'ai le message d'erreur venant de Visual studio suivant :
    System.InvalidOperationException
    HResult=0x80131509
    Message=Le flux est actuellement utilisé par une opération précédente réalisée sur celui-ci.
    Source=mscorlib
    Arborescence des appels de procédure*:
    à System.IO.StreamReader.CheckAsyncTaskInProgress()
    à System.IO.StreamReader.ReadLineAsync()
    à ServeurApp.ServerApp.Start() dans H:\Oliv73\Docs\PROG\C#\Serveur Minecraft\ServeurApp\ServeurApp\ServeurApp.cs :ligne 172
    à ServeurApp.ServerApp.StartButton_Click(Object sender, EventArgs e) dans H:\Oliv73\Docs\PROG\C#\Serveur Minecraft\ServeurApp\ServeurApp\ServeurApp.cs :ligne 119
    à System.Windows.Forms.Control.OnClick(EventArgs e)
    à System.Windows.Forms.Button.OnClick(EventArgs e)
    à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    à System.Windows.Forms.Control.WndProc(Message& m)
    à System.Windows.Forms.ButtonBase.WndProc(Message& m)
    à System.Windows.Forms.Button.WndProc(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    à System.Windows.Forms.Application.Run(Form mainForm)
    à ServeurApp.Program.Main() dans H:\Oliv73\Docs\PROG\C#\Serveur Minecraft\ServeurApp\ServeurApp\Program.cs :ligne 20

    Cette exception a été levée à l'origine dans cette pile des appels*:
    [Code externe]
    ServeurApp.ServerApp.Start() dans ServeurApp.cs
    ServeurApp.ServerApp.StartButton_Click(object, System.EventArgs) dans ServeurApp.cs
    [Code externe]
    ServeurApp.Program.Main() dans Program.cs
    sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     string output = reader.ReadLineAsync().ToString();
    Je précise que lorsque j'exécute mon .exe manuellement, une console s'ouvre et il y a des logs qui s'écrivent. Je ne sait pas si mon .exe est fait pour communiquer avec un autre .exe .
    Il écrit juste dans la console.


  9. #9
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2020
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2020
    Messages : 31
    Par défaut
    Bonjour.
    J'ai résolu le problème si dessus.
    Pour ceux qui se le demandent, il faut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadLineAsync().ToString()
    par
    Mais je ne peut pas utiliser mon applis une fois le serveur lancé car la boucle
    occupe tout le thread.
    Comment en créer un autre à partir de ce void et de manière à ce qu'il puisse changer le texte d'une RichTextBox créée dans le thread de départ (j'anticipe les problèmes d'après mes recherches ) ?
    Merci

    PS : Dois-je commencer un nouveau sujet pour le problème des threads ?

  10. #10
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2020
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2020
    Messages : 31
    Par défaut
    Excusez-moi mais je vais fermer cette discussion car j'ai trouvé une solution.
    Elle nécessite une manipulation dont je ne sais rien c'est pourquoi je vais créer un autre sujet.
    Vous pourrez m'aider ici : https://www.developpez.net/forums/d2...graphiquement/

    merci quand même !



    PS : Pour ceux qui voudrais relancer le sujet (a moins qu'il ne soit très ancien), envoyez-moi un MP et je repasse en "non résolu"

  11. #11
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    BackgroundWorker Classe (System.ComponentModel) | Microsoft Docs
    permet de démarrer un autre thread

    BackgroundWorker.ProgressChanged Événement (System.ComponentModel) | Microsoft Docs
    cet évènement permet de faire passer des infos du thread du bgw vers le thread principal (via e.UserState à priori) (car en effet tu anticipes bien)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2020
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2020
    Messages : 31
    Par défaut
    Merci !

    Mais j'ai encore une question (oui, j'en ai toujours... ).
    Comme c'est un autre sujet, vous pourrez y répondre ici :

    C'est juste au dessus


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Flex4] communication avec une classe java
    Par medos86 dans le forum Flex
    Réponses: 5
    Dernier message: 12/04/2011, 15h37
  2. Communication avec une appli déjà lancée
    Par henrygoland dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 24/04/2009, 21h27
  3. Communication avec une application externe
    Par Lethal dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 27/02/2007, 18h30
  4. [c#]Communication avec une BD
    Par chasse dans le forum Accès aux données
    Réponses: 4
    Dernier message: 19/12/2006, 23h41
  5. Réponses: 5
    Dernier message: 23/09/2006, 13h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo