我正在尝试使用 C# 运行本地进程来调用 Powerpoint 并将 .pdf 转换为 .ppt。
我制作了一个独立的控制台应用程序,希望能够重现和隔离问题。不幸的是,它适用于独立版本,但不适用于集成版本。
当它不起作用时,它不会抛出异常。它只是默默地无法创建 .pdf 文件。
新的:
我在事件日志中收到错误:
Microsoft PowerPoint
PowerPoint can't do this because a dialog box is open. Please close the dialog box to continue.
P1: 400205
P2: 15.0.4420.1017
在我的本地计算机上运行控制台命令、独立控制台应用程序或运行集成 Web 项目时,我看不到任何类型的对话框。
根据官方文档,/pt 命令应该是静默的。
我可以将运行项目的用户设置Identity为ApplicationPool我登录的用户,并且在事件日志中不再出现上述错误。但是,我没有从事件日志中得到其他错误(我可以说是相关的)。
但是,它仍然不起作用。Powerpoint 或 PDFCreator 仍然崩溃,并且不创建 .pdf。
我还尝试通过Process从我的集成问题中调用它来运行我的工作控制台应用程序,但这也不起作用。
工作控制台应用程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System;
using System.Diagnostics;
using System.Text;
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
        var psi = new ProcessStartInfo();
        psi.FileName = "\"C:\\Program Files\\Microsoft Office\\Office15\\POWERPNT.exe\"";
        psi.Arguments = "/pt \"PDFCreator\" \"\" \"\" dd0e03ff-f386-4e65-b89d-72c7f1ee502d.pptx";
        psi.WorkingDirectory = "C:\\Temp";
        psi.CreateNoWindow = true;
        psi.ErrorDialog = true;
        psi.UseShellExecute = false;
        psi.WindowStyle = ProcessWindowStyle.Hidden;
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardInput = false;
        psi.RedirectStandardError = true;
        try
        {
            using (Process exeProcess = Process.Start(psi))
            {
                exeProcess.PriorityClass = ProcessPriorityClass.High;
                var outString = new StringBuilder(100);
                exeProcess.OutputDataReceived += (s, e) => outString.AppendLine(e.Data);
                exeProcess.BeginOutputReadLine();
                var errString = exeProcess.StandardError.ReadToEnd();
                if (!string.IsNullOrEmpty(errString))
                {
                    Console.WriteLine("errors reported 1");
                }
            }
        }
        catch (Exception ex)
        {
          ex.ToString();
          Console.WriteLine("Errors reported 2 ");
          Console.WriteLine(ex.ToString());
        }
        Console.WriteLine(psi.FileName);
        Console.WriteLine(psi.Arguments);
        Console.WriteLine(psi.WorkingDirectory);
    }
}
}
它打印
"C:\Program Files\Microsoft Office\Office15\POWERPNT.exe"
/pt "PDFCreator" "" "" dd0e03ff-f386-4e65-b89d-72c7f1ee502d.pptx
C:\Temp
不工作的集成应用程序:
using System;
using System.Diagnostics;
using System.Text;
namespace CT.Services.Helper
{
    public static class ExecutableRunner
    {
        public static ExecutableResult RunExeNamed(string exeFilename, string commandLineArgs)
    {
        return RunExeNamed(exeFilename, commandLineArgs, null);
    }
    public static ExecutableResult RunExeNamed(string exeFilename, string commandLineArgs, string workingDirectory)
    {
        var result = new ExecutableResult { WasSuccessful = true };
        var psi = new ProcessStartInfo();
        psi.FileName =  "\""+exeFilename+"\"";
        psi.Arguments = commandLineArgs;
        if(!string.IsNullOrEmpty(workingDirectory))
        {
            psi.WorkingDirectory = workingDirectory;
        }
        psi.CreateNoWindow = false;
        psi.ErrorDialog = true;
        psi.UseShellExecute = false;
        psi.WindowStyle = ProcessWindowStyle.Hidden;
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardInput = false;
        psi.RedirectStandardError = true;
        try
        {
            // Start the process with the info we specified.
            // Call WaitForExit and then the using statement will close.
            using (Process exeProcess = Process.Start(psi))
            {
                exeProcess.PriorityClass = ProcessPriorityClass.High;
                var outString = new StringBuilder(100);
                // use ansynchronous reading for at least one of the streams
                // to avoid deadlock
                exeProcess.OutputDataReceived += (s, e) => outString.AppendLine(e.Data);
                exeProcess.BeginOutputReadLine();
                // now read the StandardError stream to the end
                // this will cause our main thread to wait for the
                // stream to close (which is when ffmpeg quits)
                var errString = exeProcess.StandardError.ReadToEnd();
                if (!string.IsNullOrEmpty(errString))
                {
                    result.WasSuccessful = false;
                    result.ErrorMessage = errString;
                }
            }
        }
        catch (Exception ex)
        {
            result.WasSuccessful = false;
            result.ErrorMessage = ex.ToString();
        }
        Debug.WriteLine(psi.FileName);
        Debug.WriteLine(psi.Arguments);
        Debug.WriteLine(psi.WorkingDirectory);
        return result;
    }
}
public class ExecutableResult
{
    public bool WasSuccessful { get; set; }
    public string ErrorMessage { get; set; }
}
}
它打印
"C:\Program Files\Microsoft Office\Office15\POWERPNT.exe"
/pt "PDFCreator" "" "" dd0e03ff-f386-4e65-b89d-72c7f1ee502d.pptx
C:\Temp
我认为我用作文件路径或控制台命令的字符串之一是错误的,所以我将它们打印到控制台,但您可以看到这些不是问题。