You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试Process ExitCode值?VS测试资源管理器DLL缺失问题

问题

我有一套特定场景下的进程终止机制,目标.exe依赖对应的.dll文件。这套机制在生产环境和开启“Copy referenced assemblies to workspace”设置的NCrunch中运行正常,但在Visual Studio Test Explorer里无法正常工作。

测试启动后立即崩溃,预期能拿到明确含义的特定ExitCode,但始终得到-532462766。系统日志和捕获的控制台输出都证实存在DLL缺失问题。排查后发现,测试工具生成的临时目录中,.exe和DLL文件位于不同子目录,而NCrunch会把所有文件放在主临时目录,所以能正常运行。

我希望在不通过创建环境包装进行Mock的前提下,真实测试进程能否启动并在特定条件下自行终止。以下是简化后的项目代码:

主项目(ExternalProcess)

namespace ExternalProcess {
    public class Program {
        public static void Main(string[] args) {

            CommonCode.Enums.ProcessType processType = (CommonCode.Enums.ProcessType)Enum.Parse(typeof(CommonCode.Enums.ProcessType), args[0]);

            switch (processType) {
                case CommonCode.Enums.ProcessType.TEST:
                case CommonCode.Enums.ProcessType.PROD:
                case CommonCode.Enums.ProcessType.DEV:
                    Environment.Exit((int)processType);
                    break;
                default:
                    Environment.Exit((int)CommonCode.Enums.ProcessType.ERROR);
                    break;
            }
        }
    }
}

附加DLL(ExternalProcess.CommonCode)

namespace ExternalProcess.CommonCode.Enums {
    public enum ProcessType {

        PROD,
        TEST,
        DEV,
        ERROR
    }
}

测试项目(ExternalProcessTests)

using System.Reflection;
using FluentAssertions;
using Xunit;

namespace ExternalProcessTests {
    public class ProcessTests {

        [Fact]
        public void TestProcess() {

            var processType = ExternalProcess.CommonCode.Enums.ProcessType.TEST;

            var process = new System.Diagnostics.Process {
                EnableRaisingEvents = false
            };

            process.StartInfo.FileName = Assembly.GetAssembly(typeof(ExternalProcess.Program)).Location;
            process.StartInfo.UseShellExecute = true;
            process.StartInfo.CreateNoWindow = true;
            process.StartInfo.Arguments = processType.ToString();

            process.Start();

            process.WaitForExit();

            process.HasExited.Should().BeTrue();
            process.ExitCode.Should().Be((int)processType);
        }
    }
}

内容的提问来源于stack exchange,提问作者S. Kalinowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:50:31