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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 202
    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 202
    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 202
    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 202
    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 : 356
Taille : 161,1 Ko

    Et ce que j'aurais du avoir :

    Nom : cool.png
Affichages : 340
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

+ 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