[C#] 抓取Java .JRE檔和.Net Console .EXE檔 主控台應用程式輸出的文字

[C#] 抓取Java .JRE檔和.Net Console .EXE檔 主控台應用程式輸出的文字

前言

最近開發某大型專案,有同事已寫一個邏輯在Java的.jar檔(有點類似.net的DLL或.exe檔)

我只會寫.net,必須想辦法去抓該.jar回傳給我的訊息※.net可以加入.jar參考嗎XD?

最後討論結果,java開發人員會把他的邏輯寫成.jar執行檔(就像.net的Console .exe檔),讓我去執行,去抓出該.jar檔輸出在主控台應用程式上的文字

※By the way,java要輸出主控台應用程式文字的指令,有經過學生時代的人都知道是那個吧↓

System.out.println("Hello World!!");//印出一行字

 

 

實作

必須使用到ProcessStartInfo類別Process類別

有使用過經驗的人,應該很好上手image

就好像用.net寫程式執行命令提示字元的感覺↓

image

由於要執行.JAR檔,電腦必須先安裝Java SE的JRE(Java執行環境)或 JDK(Java開發+執行環境)<=推薦裝這個,以後寫Java會用到

然後還要設定電腦Path環境變數,可參考我的另一篇文章:[Java] Windows 7 安裝 JDK Java開發環境

依要執行的.JAR檔版本,到Oracle Download頁的Previous Releases - Java Archive找可以執行該.JAR檔版本以上的JDK來安裝吧※可以詢問提供.JAR檔的人,它是哪個JDK版本

↓以下是範例.JAR檔的程式碼

image

用Windows作業系統的cmd,一般命令提示字元執行.JAR檔的結果:

image

↓.net Console程式執行該.JAR檔,並輸出結果

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;

namespace ConsoleApplication19
{
    class Program
    {
        static void Main(string[] args)
        {
            //.Jar檔的路徑
            string jarPath = Path.Combine(Environment.CurrentDirectory, "JavaApplicationConsole.jar");//我的.jar檔放到和Console .exe同個目錄下
            string parameter = "影子";//要傳給.Jar檔的參數
            //ProcessStartInfo物件富含多種屬性,非常營養,可以餵給Process.Start()來喚醒它
             ProcessStartInfo startInfo = new ProcessStartInfo("java.exe");//待會執行java.exe程式
             startInfo.Arguments = "-jar " + jarPath + " " + parameter;//要執行.Jar檔的輸入參數,注意參數間都有空格
            startInfo.UseShellExecute = false;//加這兩段,抓.Jar檔輸出的文字,才不會發生例外:InvalidOperationException
            startInfo.RedirectStandardOutput = true;
            string jarOutputText = "";//該.Jar檔輸出在主控台的文字
            using (Process p = Process.Start(startInfo))//執行.Jar檔
            {
                //指示 Process 物件無限期等候處理序的結束。
                p.WaitForExit();
                using (StreamReader sr = p.StandardOutput)
                {
                    jarOutputText = sr.ReadToEnd();
                }
            }
            //.Net Console程式印出結果
            Console.WriteLine(jarOutputText.Trim());
            //暫停畫面
            Console.ReadKey();
        }
    }
}

image

 

====分隔線====

相對的,如果有人已寫了一支.net Console A,該如何抓到那支Console A輸出主控台的文字方法,如下↓

※提醒一下,如果兩方都是採用.net方案,建議還是用加入DLL參考、呼叫WebService或丟原始碼.cs檔(同家公司的同仁才有可能)給另一位.net開發者會比較方便。

假設.net Console A↓

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Odbc;

namespace ConsoleApplication18
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello我是Console A");
        }
    }
}

然後要讀取該Console的輸出文字的話↓

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;

namespace ConsoleApplication19
{
    class Program
    {
        static void Main(string[] args)
        {
            //Console A的程式路徑
            string exePath = @"D:\ConsoleApplication18\ConsoleApplication18\bin\Debug\ConsoleApplication18.exe";
            //ProcessStartInfo物件富含多種屬性,非常營養,可以餵給Process.Start()來喚醒它
            ProcessStartInfo startInfo = new ProcessStartInfo(exePath);
            startInfo.Arguments = "";//要執行Console A的輸入參數
            startInfo.UseShellExecute = false;//加這兩段,才不會發生例外:InvalidOperationException
            startInfo.RedirectStandardOutput = true;
            Process p  = Process.Start(startInfo);
            //指示 Process 物件無限期等候處理序的結束。
            p.WaitForExit();
            string exeOutputText = "";//該處理序輸出在主控台的文字
            using (StreamReader sr = p.StandardOutput)
            {
                exeOutputText = sr.ReadToEnd();
            }

            //印出結果
            Console.WriteLine(exeOutputText.Trim());

            //暫停畫面
            Console.ReadKey();
             
        }
    }
}

執行結果:

image

 

 

 

 

 

參考文章

How to call an Executable Jar file from Dot Net Windows application?

How to get execution directory of console application