天天看点

C#中Process类启动可执行程序导致可执行程序崩溃

问题说明

  项目组开发的程序(简称程序A)要调用另外一个可执行程序(简称程序B),而在程序B中又通过动态加载的方式调用了一个动态链接库中的函数(简称函数C)。程序A和程序B都是用C#语言开发的,调用方式是在程序A中使用Process类通过带参数的方式启动程序B,如下图所示,调用的代码大致如下:

Process myProcess = new Process();
myProcess.StartInfo.FileName = programAFileAddress;
myProcess.StartInfo.Arguments = programAArguments;
myProcess.Start();
           
C#中Process类启动可执行程序导致可执行程序崩溃

  程序B独立运行时可以正常启动,也能够正常加载动态链接库并调用其中的函数C。但是如果在程序A中通过带参数的Process类调用程序B,则在调用动态链接库中的函数C时报错,外在表现是操作系统给出一个应用系统崩溃(APPCRASH)的提示,指明崩溃的程序是程序B,调试到程序B中后发现是在调用动态链接库中的函数C时报错,错误信息大致为内存损坏无法读取等等。

解决方法

  程序A和程序B并没有在同一个目录下,通过百度以及咨询经验丰富的同事后,认为可能是在程序A中调用程序B后,程序B启动后继承了程序A的某些信息(纯属个人猜测),于是在MSDN中查找Process类中是否有属性或方法可以设置通过Process类启动的程序能够独立运行或者是不使用调用程序的信息等,最终发现Process类中好像是没有这种属性或方法。不过在找的过程中在Process的StartInfo中找到了一个属性WorkingDirectory,该属性用于获取或设置包含要启动的进程的目录(详细属性介绍请参见参考文献1),于是猜测会不会是程序B启动时默认的目录用的程序A的目录(不懂原理,纯属猜测),然后抱着试试的态度将WorkingDirectory设置为程序B的目录,代码如下,再从程序A中启动程序B后,在程序B中就可以正常调用动态链接库中的函数C了。

Process myProcess = new Process();
myProcess.StartInfo.FileName = programAFileAddress;
myProcess.StartInfo.Arguments = programAArguments;
myProcess.StartInfo.WorkingDirectory = programADir;
myProcess.Start();
           

参考文献:

[1]https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.processstartinfo.workingdirectory?view=netframework-4.8