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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:45:10