• dotnet 启动进程传入不存在的文件夹作为工作目录行为变更


    本文记录在 dotnet 下,启动进程,传入不存在的文件夹作为进程的工作目录,分别在 .NET Framework 和 .NET Core 的行为

    在 dotnet 6 下,可以使用 ProcessStartInfo 辅助创建 Process 进程,如以下代码进行测试,传入不存在的 Z:\Windows 文件夹

    Console.WriteLine($"Fx {Environment.CurrentDirectory}");
    
    if (args.Length > 0)
    {
        return;
    }
    
    var location = Assembly.GetExecutingAssembly().Location;
    var fileName = Path.GetFileNameWithoutExtension(location);
    var directory = Path.GetDirectoryName(location);
    
    var exe = Path.Combine(directory, fileName + ".exe");
    var processStartInfo = new ProcessStartInfo(exe,"fx")
    {
        WorkingDirectory = "Z:\\Windows"
    };
    var process = Process.Start(processStartInfo);
    

    运行将会在 Process.Start 方法上抛出 System.ComponentModel.Win32Exception 说 目录名称无效

    如果是在英文环境下,将会提示 The directory name is invalid 从而失败

    但如果没有设置 ProcessStartInfo 的 WorkingDirectory 工作路径,那么默认将使用当前进程的 Environment.CurrentDirectory 值作为启动进程的工作路径

    在 .NET Core 和 .NET Framework 下,启动时,设置 UseShellExecute 分别为 true 和 false 的值,行为有所不同。在不设置 ProcessStartInfo 的 WorkingDirectory 工作路径,让新的进程默认使用 Environment.CurrentDirectory 工作文件夹。但是此工作路径是一个被插拔的 U 盘的路径,如以下代码

                Environment.CurrentDirectory = @"I:\";
    
                var exe = Path.Combine(directory, fileName + ".exe"); // 执行到这句代码的时候,拔出 U 盘,让 I:\ 不存在
                var processStartInfo = new ProcessStartInfo(exe, "fx")
                {
                    UseShellExecute = true, // 也设置为 false 的值
                };
                var process = Process.Start(processStartInfo);
                process.WaitForExit();
    

    我使用 .NET 6 和 .NET Framework 4.5 进行分别的测试,测试如下:

    在 .NET Core 下,设置 UseShellExecute=false 的值,运行结果是:成功,新进程工作路径等于 I:\ 路径

    在 .NET Core 下,设置 UseShellExecute=true 的值,运行结果是:成功,新进程工作路径等于 C:\Windows 路径

    在 .NET Framework 下,设置 UseShellExecute=false 的值,运行结果是:运行 Process.Start 失败,提示 System.ComponentModel.Win32Exception: '目录名称无效。' 错误

    在 .NET Framework 下,设置 UseShellExecute=true 的值,运行结果是:成功,新进程工作路径等于 C:\Windows 路径

    更多请看 c# - Win32Exception: The directory name is invalid - Stack Overflow

    CreateProcess and ShellExecute differences - Stack Overflow

    本文所有代码放在githubgitee 欢迎访问

    可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

    git init
    git remote add origin https://gitee.com/lindexi/lindexi_gd.git
    git pull origin f7696a3e9f33dfcbfdd8ab92afaa77ab668dfeb9
    

    以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源

    git remote remove origin
    git remote add origin https://github.com/lindexi/lindexi_gd.git
    

    获取代码之后,进入 HebarlawkuKekebuwagay 文件夹

  • 相关阅读:
    lua敏感词过滤
    解决灰色shader与mask冲突的方案
    Lua加密
    不同版本Lua介绍
    如何用pycharm 控制远程服务器来跑代码!!!!!!!!!!!!非常牛逼
    如何用win10自带linux系统学习c语言---解决gdb使用问题
    分享一些机器学习,数学和工科书籍和看过的一些论文笔记都在里面
    登录网站的autohotkey脚本
    wmware虚拟化的启动问题
    茶杯头开枪ahk代码
  • 原文地址:https://www.cnblogs.com/lindexi/p/15941908.html
Copyright © 2020-2023  润新知