如何在C#代码中直接调用dotnet CLI核心逻辑而非通过进程?
直接在C#代码中使用dotnet测试核心逻辑的方案
SDK内部代码无法直接通过NuGet引用
dotnet SDK里的测试核心逻辑(比如测试发现、执行的底层代码)并没有打包成公开NuGet包,因为这些是SDK内部实现,微软不承诺向后兼容,不会作为正式库发布。你看到的仓库代码是SDK整体的一部分,没法直接引入项目。用官方测试SDK实现需求
要在代码里做测试发现、执行,应该用Microsoft.NET.Test.Sdk这个NuGet包,它是所有.NET测试框架的核心依赖,包含了测试处理的核心逻辑。再结合xUnit、NUnit这类测试框架的API,能拿到比控制台命令更详细的信息:- 测试发现:用框架提供的
ITestDiscoverer接口自定义发现逻辑,直接遍历测试用例的所有属性、类信息 - 测试执行:通过
ITestExecutor接口执行测试,获取测试耗时、错误堆栈、自定义标注等控制台输出没有的细节
- 测试发现:用框架提供的
xUnit示例代码
先安装必要的NuGet包:xunit、xunit.runner.visualstudio、Microsoft.NET.Test.Sdk
然后可以写这样的代码来操作测试:
using System.Reflection; using Xunit.Abstractions; using Xunit.Runner.VisualStudio; // 加载测试项目程序集 var testAssembly = Assembly.LoadFrom(@"YourTestProject\bin\Debug\net6.0\YourTestProject.dll"); // 消息接收器用于处理测试输出 var messageSink = new ConsoleMessageSink(); // 初始化测试发现器 var discoverer = new VsTestDiscoverer(messageSink); var discoveryOptions = new TestDiscoveryOptions(); // 发现所有测试用例 var testCases = discoverer.Discover(testAssembly, discoveryOptions); // 遍历输出测试信息 foreach (var testCase in testCases) { Console.WriteLine($"测试名称:{testCase.DisplayName}"); Console.WriteLine($"所属类:{testCase.TestMethod.TestClass.Class.Name}"); Console.WriteLine($"测试方法:{testCase.TestMethod.Method.Name}"); } // 执行测试 var executor = new VsTestExecutor(messageSink); var executionOptions = new TestExecutionOptions(); await executor.RunTests(testCases, executionOptions);
- 注意点
- 这类API属于测试框架的半公开接口,虽然日常使用稳定,但版本更新时可能有变动,要保证测试框架和SDK版本匹配
- 如果需要更底层的SDK逻辑(比如解析项目文件、处理测试配置),只能从dotnet SDK仓库里提取相关代码自行封装,注意版权和版本兼容性问题
内容的提问来源于stack exchange,提问作者Marat Tim
相关产品推荐
相关产品推荐

