Linux下如何让新启动的子进程识别.NET的路径?
解决方案
1. 直接通过dotnet命令启动.NET应用(推荐)
你的SAT.FCCHandling是.NET应用,若为框架依赖发布,必须通过dotnet命令启动,而非直接执行二进制文件。修改Linux分支代码,绕开bash的环境变量问题:
#if (WINDOWS) string strCmdText = $"/C \"SAT.FCCHandling -l{password} -i{ip} -xDeleteFCC\""; #endif #if (LINUX) // 直接指定dotnet命令,传入应用程序集路径和参数 var appPath = Path.Combine(AppContext.BaseDirectory, "SAT.FCCHandling.dll"); string strCmdText = $"{appPath} -l{password} -i{ip} -xDeleteFCC"; #endif using (var proc = Process.Start(new ProcessStartInfo { #if (WINDOWS) FileName = "cmd.exe", Arguments = strCmdText, #endif #if (LINUX) FileName = "dotnet", // 直接调用dotnet运行时 Arguments = strCmdText, #endif UseShellExecute = false, RedirectStandardOutput = true, CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden })) { proc.WaitForExit(); if (proc.ExitCode != 0) { Assert.Fail("There was an issue Inserting an invalid FCC."); } }
2. 修正bash调用逻辑(若必须通过bash启动)
若坚持用bash,需解决两个核心问题:路径格式错误、环境变量缺失:
- Linux路径用
./SAT.FCCHandling而非.//SAT.FCCHandling - 显式传递.NET环境变量(
DOTNET_ROOT和PATH)
修改Linux分支代码:
#if (LINUX) // 替换为你的dotnet实际安装路径,默认通常是/usr/share/dotnet string dotnetRoot = "/usr/share/dotnet"; // 修正路径格式,并显式设置环境变量后执行应用 string strCmdText = $"-c \"export DOTNET_ROOT={dotnetRoot}; export PATH=$PATH:{dotnetRoot}; ./SAT.FCCHandling -l{password} -i{ip} -xDeleteFCC\""; #endif
3. 确保子进程工作目录正确
设置ProcessStartInfo.WorkingDirectory为SAT.FCCHandling所在的二进制目录,避免路径解析错误:
using (var proc = Process.Start(new ProcessStartInfo { // ...其他配置项 // 设置为当前测试程序的输出目录,或直接指定目标应用的目录 WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) }))
额外检查项
- 若
SAT.FCCHandling是自包含发布的,需确保二进制文件有执行权限:在终端执行chmod +x SAT.FCCHandling - 验证VSCode调试环境的
PATH变量:在调试控制台执行echo $PATH,确认包含dotnet的安装路径
内容的提问来源于stack exchange,提问作者JB4Cycling
相关产品推荐
相关产品推荐

