【问题标题】:Silently passing an .nsi file to the cmd as an argument, execute it and create an .exe将 .nsi 文件作为参数静默传递给 cmd,执行它并创建一个 .exe
【发布时间】:2016-11-21 13:08:25
【问题描述】:

我正在开发 NSIS 安装程序(Windows 窗体应用程序)。

应用程序的主要思想 - 用户通过 Windows 窗体应用程序,配置所有需要的设置,当他/她点击“完成”时,会自动生成一个 .nsis 文件。 makeNSIS.exe 也包含在我的应用程序中,因此用户无需安装它即可使用我的安装程序。

我的目标是默默地生成一个 setup.exe 文件。我想将我自动生成的 .nsi 文件作为参数传递给每个 cmd 的 makeNSIS.exe,告诉它执行它并在某个路径创建一个 setup.exe 文件。我希望整个事情都安静地完成。

我失败的试验之一:

        ProcessStartInfo psi = new ProcessStartInfo();
        //my automatically generated nsis file
        psi.Arguments = Application.StartupPath + "\\NSIS\\NSIS SG Project\\NSIS\\My application.nsi";
        psi.CreateNoWindow = true;
        psi.WindowStyle = ProcessWindowStyle.Hidden;
        //nsis application that is included in my project so that users wouldn't have to install it
        psi.FileName = Application.StartupPath + "\\NSIS\\makeNSIS.exe";
        Process.Start(psi);

我做错了什么?

【问题讨论】:

  • 如果不隐藏窗口,输出是否有错误?进程退出代码?
  • 它说它是成功的,但我在任何地方都没有看到生成的 exe 文件。即使我直接在cmd中输入“makensis.exe mynsisfile.nsi”,一切都执行成功,但是看不到任何exe文件。会是什么?
  • .nsi 中的“OutFile”指令设置生成的安装程序的名称(和可选路径)。
  • 它没有生成。也许是因为我没有启动 .nsi 文件,只是编译它?如何编译并开始使用命令行?在谷歌上找不到。

标签: c# .net nsis


【解决方案1】:

NSIS.exe 不是编译器,MakeNSIS.exe 是! Stubs、Plugins 和 Include 目录也是必需的,可能还有 Contribs 目录。

【讨论】:

  • 我知道makensis.exe。为了清楚起见,我将其重命名为 nsis.exe。所有目录都完好无损。
  • @Dovile:NSIS 已经有了另一个叫做 NSIS.exe 的东西,我不会这么说。
【解决方案2】:

我知道这是个老问题,但我有一个可能的解决方案。 如果你用 C#(WinForm、WPF 等)编写应用程序,你可以使用这个:

ProcessStartInfo startInfo = new ProcessStartInfo
                {
                    CreateNoWindow = true,
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    //Path to makensis.exe
                    FileName = "C:\\NSIS\\makensis.exe",
                    //make the window Hidden
                    WindowStyle = ProcessWindowStyle.Hidden,
                    //Source to your nsis script
                    Arguments = "D:\\Script\\myapp.nsi"
                };
                try
                {
                    using (Process exeProcess = Process.Start(startInfo))
                    {
                        exeProcess.WaitForExit();
                    }
                }
                catch (Exception exc)
                {
                    // handle exception
                }

在很多情况下,这对我来说是一个通用的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    相关资源
    最近更新 更多