[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類別
就好像用.net寫程式執行命令提示字元的感覺↓
由於要執行.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檔的程式碼
用Windows作業系統的cmd,一般命令提示字元執行.JAR檔的結果:
↓.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();
}
}
}
====分隔線====
相對的,如果有人已寫了一支.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();
}
}
}
執行結果:
參考文章:
How to call an Executable Jar file from Dot Net Windows application?