在C#中使用exe时出现异常

本文关键字:异常 exe | 更新日期: 2023-09-27 18:27:38

我为Java代码创建了一个exe,并试图在C#应用程序中使用它。我像这个一样使用它

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = "abc.exe";
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = args; 
try
{
    // Start the process with the info we specified.
    // Call WaitForExit and then the using statement will close.
    using (Process exeProcess = Process.Start(startInfo))
    {
         exeProcess.WaitForExit();
    }
}
catch (Exception ex)
{
    // Log error.
    MessageBox.Show(ex.Message);
}

就在这之后,我阅读了exe应该创建的文本文件。

System.IO.StreamReader file =
           new System.IO.StreamReader(textFile);

但我在阅读文本文件时遇到了异常,上面写着"文件正被另一个进程使用"

现在我确信除了exe之外,没有其他进程正在访问此文件。我还调用了WaitForExit()方法。但我还是得到了例外。有人知道怎么解决这个问题吗?

编辑:我通过删除文本文件并再次运行代码来再次测试代码。我得到了异常FileNotFound。因此,似乎代码甚至在exe完成写入之前就试图读取文件。我如何才能强制读取文件,只有在exe释放文件后才能执行?

在C#中使用exe时出现异常

您正在使用WaitForExit调用阻止应用程序,从而阻止Windows处理UI事件。我建议将您的代码移动到另一种方法,如

编辑:所以在运行abc或ebc可能太快之后,您可能没有其他代码。

class Program
{
    private static bool eventHandled;
    private static int elapsedTime;

    static void Main(string[] inputArgs)
    {
        string args = string.Empty;
        try
        {
            Process exeProcess = new Process();
            exeProcess.StartInfo.CreateNoWindow = false;
            exeProcess.StartInfo.UseShellExecute = false;
            exeProcess.StartInfo.FileName = "abc.exe";
            exeProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            exeProcess.StartInfo.Arguments = args;
            exeProcess.EnableRaisingEvents = true;
            exeProcess.Exited +=  OnProcessExited;
            exeProcess.Start();
        }
        catch (Exception ex)
        {
            // Log error.
            Console.WriteLine(ex.Message);
        }
        // Wait for Exited event, but not more than 30 seconds.
        const int SLEEP_AMOUNT = 100;
        while (!eventHandled)
        {
            elapsedTime += SLEEP_AMOUNT;
            if (elapsedTime > 30000)
            {
                break;
            }
            Thread.Sleep(SLEEP_AMOUNT);
        }
    }
    private static void OnProcessExited(object sender, EventArgs eventArgs)
    {
        // do your work here   
        eventHandled = true;
    }
}