如何使用C#从java进程获取带参数的ProcessStartInfo?
我正在尝试使用C#获取java进程对象。 问题是我的计算机上运行了几个java进程 以下是我选择的获取进程的方式:如何使用C#从java进程获取带参数的ProcessStartInfo?,c#,java,process,arguments,C#,Java,Process,Arguments,我正在尝试使用C#获取java进程对象。 问题是我的计算机上运行了几个java进程 以下是我选择的获取进程的方式: Process[] processes = Process.GetProcessesByName("java"); foreach(Process proc in processes){ //I need a filter here to get the correct process. } java进程也由我的C#程序控制,如下所示: ProcessStartInfo
Process[] processes = Process.GetProcessesByName("java");
foreach(Process proc in processes){
//I need a filter here to get the correct process.
}
java进程也由我的C#程序控制,如下所示:
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = javahome + "\\bin\\java.exe";
startInfo.Arguments = "-jar Example.jar port=88888";
startInfo.WorkingDirectory = "\\testFolder";
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
Process proc = new Process();
proc.StartInfo = startInfo;
proc.Start();
我想要的是遍历进程数组,检查哪个进程与我在另一个程序中启动的进程对象具有相同的参数。
但问题是当我这样做的时候:
Console.WriteLine(proc.StartInfo.Arguments);
我发现里面什么都没有,即使我知道这是我在另一个程序中开始的过程。这让我很困惑
有人知道这个问题吗?你不能那样做。当您启动一个流程时,请将该流程的处理程序保存在一个字典中,其中的值是流程参数,这是我看到的唯一归档该流程的方法
Dictionary<IntPtr, string> processArguments = new Dictionary<IntPtr,string>();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = javahome + "\\bin\\java.exe";
startInfo.Arguments = "-jar Example.jar port=88888";
startInfo.WorkingDirectory = "\\testFolder";
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
Process proc = new Process();
proc.StartInfo = startInfo;
proc.Start();
processArguments.Add(proc.Handle, javahome + "\\bin\\java.exe");
....
Process[] processes = Process.GetProcessesByName("java");
foreach (Process proc in processes)
{
var arguments = processArguments.Where(x => x.Key.Equals(proc.Handle)).FirstOrDefault().Value;
}
Dictionary processArguments=new Dictionary();
ProcessStartInfo startInfo=新的ProcessStartInfo();
startInfo.FileName=javahome+“\\bin\\java.exe”;
startInfo.Arguments=“-jar Example.jar port=88888”;
startInfo.WorkingDirectory=“\\testFolder”;
startInfo.UseShellExecute=false;
startInfo.CreateNoWindow=true;
Process proc=新流程();
proc.StartInfo=StartInfo;
proc.Start();
processArguments.Add(proc.Handle,javahome+“\\bin\\java.exe”);
....
Process[]processs=Process.GetProcessesByName(“java”);
foreach(过程中的过程过程)
{
var arguments=processArguments.Where(x=>x.Key.Equals(proc.Handle)).FirstOrDefault().Value;
}
您可以使用LINQ进行如下尝试:
Process[] processes = Process.GetProcessesByName("java");
var fileteredProcess = from pro in processes
where (pro.StartInfo.WorkingDirectory == "workingDIR") &&
(pro.StartInfo.Arguments == "Arguments")
select pro;
foreach (var proc in fileteredProcess)
{
}
以下是使用WMI的替代解决方案:
Process[] processes;
Process selectedProc = null;
int selectedProcId = 0;
// http://wutils.com/wmi/
// using System.Management;
ManagementScope scope = new ManagementScope("\\\\.\\ROOT\\cimv2");
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Process "
+ "WHERE Name = 'java.exe'");
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(scope, query);
ManagementObjectCollection queryCollection = searcher.Get();
foreach (ManagementObject m in queryCollection)
{
// access properties of the WMI object
Console.WriteLine("CommandLine : {0}", m["CommandLine"]);
Console.WriteLine("ProcessId : {0}", m["ProcessId"]);
if (m["CommandLine"].ToString().Contains("my pattern"))
{
selectedProcId = int.Parse(m["ProcessId"].ToString());
selectedProc = Process.GetProcessById(selectedProcId);
break;
}
}
if (selectedProc != null)
{
Console.WriteLine("Proc title {0}", selectedProc.MainWindowTitle);
}
我的问题是它们运行在两个不同的程序中。一个用于启动,一个用于杀死。有没有办法做这样的手术?哦,我明白了。您可以使用内存映射文件在两个应用程序之间共享数据(字典):非常感谢!这就是我想要的。pro.StartInfo为空(可能仅适用于非管理员用户)。