Java和.net互操作性

时间:2010-04-21 06:14:24

标签: c# interop

我有一个c#程序,我通过它打开cmd窗口作为一个过程。在此命令窗口中,我正在运行批处理文件。我正在将该批处理文件命令的输出重定向到文本文件。当我运行我的应用程序时,一切似乎都没问题。

但很少一次,Application会给出一些错误,例如“无法访问该文件。它正被另一个应用程序使用”,同时cmd窗口没有关闭。如果我们通过任务管理器关闭cmd进程,那么它将内容写入文件并关闭。即使我关闭了cmd进程,仍然没有释放文件句柄。所以我下次不能运行应用程序。总是它说不能访问该文件。只有在重新启动系统后,它才能正常工作。

这是我的代码:

Process objProcess = new Process();
ProcessStartInfo objProInfo = new ProcessStartInfo();
objProInfo.WindowStyle = ProcessWindowStyle.Maximized;
objProInfo.UseShellExecute = true;
objProInfo.FileName = "Batch file path"                
objProInfo.Arguments = "Some Arguments";
if (Directory.Exists(strOutputPath) == false)
{
  Directory.CreateDirectory(strOutputPath);
}               
objProInfo.CreateNoWindow = false;
objProcess.StartInfo = objProInfo;                
objProcess.Start();                
objProcess.WaitForExit();

test.bat的:

 java classname argument > output.txt

这是我的问题:

  1. 我无法追查问题所在..

  2. 我们如何看待持有ant文件句柄的过程。

  3. 是否有关于Java和.net互操作性的建议

3 个答案:

答案 0 :(得分:1)

在这样的情况下,我启动Process Explorer(通过Sysinternals,很棒的工具顺便说一句)单击Ctrl + F,然后输入文件的名称。它将搜索所有正在运行的进程,并将打开它的应用程序列出该文件的文件句柄。

然后您可以放下句柄,或者杀死应用程序 - 无论您认为哪个更好)

答案 1 :(得分:0)

您可以尝试从C#中分叉和附加文件描述符,而不是启动bat文件。

答案 2 :(得分:0)

我认为问题是因为当C#程序在其上写东西时,java程序正在访问文本文件,因此“文件无法访问”问题。

如果我是你,我会用C#做所有事情 - 我不会用Java来读取C#程序的状态。只有在我完成C#需要做的任何事情之后,我才会访问该文件。

至于查看锁定文件的进程,可以使用Process Explorer来实现此目的。