【问题标题】:Keeping the subprocess environment for the caller process in C#在 C# 中为调用者进程保留子进程环境
【发布时间】:2020-08-23 12:29:07
【问题描述】:

我想设置一个 Visual C++ 工具链以在我的 C# 应用程序中使用。对于工具链,建议调用vcvarsall(或一些子变体)。我的问题是调用进程——我的应用程序——将无法保持vcvarsall 设置的环境。这能以某种方式实现吗?

// First set up the toolchain with vcvarsall
var vcvarsallProc = new Process 
{ 
    StartInfo = new ProcessStartInfo
    {
        FileName = vcvarsallPath,
        Arguments = "x86",
        UseShellExecute = false,
    }
};
vcvarsallProc.Start();
vcvarsallProc.WaitForExit();

// Invoke the linker for example
var linkerProc = new Process 
{ 
    StartInfo = new ProcessStartInfo
    {
        FileName = "LINK.exe",
        Arguments = " foo.obj /OUT:a.exe",
        UseShellExecute = false,
    }
};
linkerProc.Start();
linkerProc.WaitForExit();
// ERROR: 'LINK' is not recognized as an internal or external command

【问题讨论】:

    标签: c# process environment-variables


    【解决方案1】:

    事实证明,这几乎是不可能的。

    最好的办法是链接多个命令,这些命令将在同一环境中运行。可以这样做:

    var linkerProc = new Process 
    { 
        StartInfo = new ProcessStartInfo
        {
            FileName = "cmd.exe",
            Arguments = $"/C ({vcvarsallPath} {vcvarsallArgs}) && (LINK.exe {linkArgs})",
            UseShellExecute = false,
        }
    };
    

    将其隐藏在InvokeWithEnvironment 之类的函数后面,使用起来非常轻松。

    【讨论】:

      猜你喜欢
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2019-01-20
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      相关资源
      最近更新 更多