今天调试程序的时候遇到一个大坑,程序A(exe)通过Process Start启动程序B(exe)进程,总是报错。

上图是程序结构,为了让所有的程序B实例共享配置,所以把app.ini放在了bin的上级目录。

启动进程代码:

  1. System.Diagnostics.Process p = new System.Diagnostics.Process();
  2. p.StartInfo = new ProcessStartInfo(fileName);
  3. p.Start();

最后定位到配置文件路径读取问题。这是System.Environment.CurrentDirectory遇到大坑。

程序B中有一下代码是用于获取app.ini中的配置:

  1. DirectoryInfo topDir = Directory.GetParent(System.Environment.CurrentDirectory);
  2. string iniFileName = Path.Combine(topDir.FullName, "app.ini");

问题症状:

通过程序A启动B,报错。但是通过单独启动程序B正常。

后来发现System.Environment.CurrentDirectory确实是获取当前目录没错,但是如果A程序调用B程序,当B程序里使用了System.Environment.CurrentDirectory获取目录。那么这个B程序里获取的这个目录就不再是B的应用程序所在目录了;而变成了A所在的目录了。

解决方案:

1、使用Application.StartupPath获取目录,需要引用:using System.Windows.Forms,因此这个方法只能用于winform程序。

2、使用AppDomain.CurrentDomain.BaseDirectory,通用方案,可以用于类库。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

后来发现很多网友和我遇到过一样的问题。

下面引用一下网友写的文章:

https://blog.csdn.net/albert528108/article/details/102958457

  1. // 获取程序的基目录。
  2. System.AppDomain.CurrentDomain.BaseDirectory
  3. // 获取模块的完整路径。
  4. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
  5. // 获取和设置当前目录(该进程从中启动的目录)的完全限定目录。
  6. System.Environment.CurrentDirectory
  7. // 获取应用程序的当前工作目录。
  8. System.IO.Directory.GetCurrentDirectory()
  9. // 获取和设置包括该应用程序的目录的名称。
  10. System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
  11. // 获取启动了应用程序的可执行文件的路径。
  12. System.Windows.Forms.Application.StartupPath
  13. // 获取启动了应用程序的可执行文件的路径及文件名
  14. System.Windows.Forms.Application.ExecutablePath

我以前写的代码中获取当前路径基本上都是使用的System.Environment.CurrentDirectory。
但是最近在用另外一个程序A去调用以前的程序B的时候就出现问题了,程序A的作用只是单纯调取程序B的exe文件,在B执行过程中总是真到当前路径这块就出现了问题,实际找到的路径是程序A的路径。
    程序A目录:D:\a
    程序B目录:D:\b
    当程序A调用程序B时,程序B中的Environment.CurrentDirectory结果是D:\a,而不是D:\b!!
经反复测试发现System.Environment.CurrentDirectory确实是获取当前目录没错,但是如果A程序调用B程序 B程序里使用了System.Environment.CurrentDirectory获取目录。那么这个B程序里获取的这个目录就不再是B的应用程序所在目录了;而变成了A所在的目录了。这也就不难发现我在开机时弹出的目录是C:\Windows\System32 因为开机自启动程序也是由windows的某个进程调用的。
当遇到这样的情况时,我自己的解决方案是:
把所有System.Environment.CurrentDirectory改成System.AppDomain.CurrentDomain.BaseDirectory。
网上也有很多人说针对winform可以改成Application.StartupPath。
C# WinForm中AppDomain.CurrentDomain.BaseDirectory与Application.StartupPath的区别示例如下:
    1. AppDomain.CurrentDomain.BaseDirectory 返回结果为: D:\xxx\
    Application.StartupPath 返回结果为: D:\xxx
    2. Application.StartupPath 只能用于WinForm窗体中,而AppDomain.CurrentDomain.BaseDirectory既可以用于WinForm窗体中,也可以用于类库DLL文件中。

警惕使用System.Environment.CurrentDirectory遇到的坑相关推荐

  1. Environment.CurrentDirectory 的一个坑

    事情是这样的,今天写测试代码的时候发现,进程 A 调用进程 B,A 与 B不在同一路径下,B 中使用Environment.CurrentDirectory 获取当前路径,本以为获取的路径应为 B 所 ...

  2. C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题

    C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 参考文章: (1)C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 ( ...

  3. oracle管理员是sys吗,Oracle管理员sys,system登录无权限的坑

    2019独角兽企业重金招聘Python工程师标准>>> 连接本地oracle数据库时sys账号提示没有权限??? 搭库的时候,发现system登录提示:insufficient pr ...

  4. 关于os.system和os.popen的坑

    最近需要在python脚本中执行shell脚本,出现各种坑,特此记录一下. 关于阻塞调用 1.os.popen 该命令会先创建一个管道,然后fork一个子进程,关闭管道的一端,执行exec,最后返回一 ...

  5. 警惕职场的竞业协议坑

    阅读本文大概需要 2.6 分钟. 最近,后台有好几个读者问我关于竞业协议的问题,大概类似于: 张哥,新入职了一家公司,但是入职的时候签合同额外要签一份所谓的竞业协议,职场小白不懂这个,该不该签? 张哥 ...

  6. 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程

    Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的 ...

  7. Unity3D之Windows端隐藏任务栏图标并添加至托盘

    目录 1 基本效果 2 代码实现 2.1 思路 2.2 实现 2.2.1 Unity程序监听最小化和关闭事件 2.2.2 方便打包的菜单栏 2.2.3 IL2CPP启动外部程序 2.2.4 winfo ...

  8. 使用最新版ODA试用版创建dwg文件

    工程软件实在是变化太慢,16年接触这个oda,现在都2021年了,仍然变化不大,读取cad还是需要这个oda.希望国产cad(完全是自己的核心库,并非使用什么oda)软件早点发展壮大.有种我们现在不开 ...

  9. pythonturtle画小白兔_使用Python+turtle绘制动画重现龟兔赛跑现场

    jQuery 基础(3) -- jQuery 事件 jQuery 是为事件处理特别设计的.什么是事件?页面对不同访问者的响应叫做事件.事件处理程序指的是当 HTML 中发生某些事件时所调用的方法.实例 ...

最新文章

  1. 【MSTR产品】获取当前登陆用户的login_id
  2. Egret之ProtoBuf(引用)
  3. [Usaco2010 Mar]gather 奶牛大集会
  4. Cannot retrieve mapping for action
  5. 我爱我家:旗下APP已全面兼容鸿蒙系统
  6. 简介NoSqlOnSql在SQL上实现NOSQL
  7. Pytorch出现Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
  8. django项目基础
  9. win7欢迎界面时间长_win7系统msvcr100.dll丢失如何解决msvcr100.dll丢失解决方法【详解】...
  10. Java基础教程【第七章:包和接口】
  11. 数据结构算法题整理2
  12. 计算机专业英语词汇pdf,计算机专业英语词汇大全(完美打印版).pdf
  13. c语言——求逆矩阵,伴随矩阵,行列式
  14. 华为云CDN加速WAF防护资源实践
  15. vlookup和sumif函数使用通配符
  16. docker-Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon runn
  17. 一帘心事碎碎念,一眸雪舞剪剪风
  18. 布局与控件(七)-ListView知多少(上)
  19. springDataJpa @Query注解多条件动态模糊分页查询,传入形参对象
  20. 直播流媒体怎么做到加密

热门文章

  1. OpenCV使用GDAL读取地理空间栅格文件
  2. C++实现顺序查找(附完整源码)
  3. cmake构建器最新Windows/MACOS/LINUX版本分享
  4. PHP probuf详细步骤_初识protobuf和php的相关用法
  5. python区域增长_Python – 有效地为高密度区域创建密度图,稀疏区域的点
  6. 二阶龙格库塔公式推导_DeepFM原理推导
  7. 「JupyterNotebook」Jupyter快捷键个人笔记
  8. 26、ES中使用mget批量查询api(学习笔记,来自课程资料 + 自己整理)
  9. 2cocos2dx别踩白块游戏案例
  10. Mule ESB-3.Build a webservice proxy