迁移至VS2019后vstestconsole无法找到自定义CatchEventsCollector
自定义DataCollector在VS2019 vstest.console中无法识别的解决思路
以下是针对该问题的排查与解决方向:
检查DataCollector类的特性标记
确认CatchEventsCollector类是否正确添加了匹配的特性:[DataCollectorFriendlyName("CatchEventsCollector")] [DataCollectorTypeUri("datacollector://TestCompany/FfbeTestFramework/1.0")] public class CatchEventsCollector : DataCollector { // 类实现 }特性中的
friendlyName和DataCollectorTypeUri必须与runsettings文件中的friendlyName、uri字段完全一致,包括大小写和格式。VS2019的TestPlatform对特性匹配的校验比旧版本更严格。验证程序集的强签名与版本信息
如果你的Datacollector.dll是强签名的,runsettings中的assemblyQualifiedName必须包含公钥令牌。可以通过sn -T Datacollector.dll命令获取公钥令牌,补充到配置中:<DataCollector friendlyName="CatchEventsCollector" uri="datacollector://TestCompany/FfbeTestFramework/1.0" assemblyQualifiedName="Datacollector.CatchEventsCollector, Datacollector, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxx" />确保版本号、公钥令牌与实际DLL的属性完全匹配。
确认DLL依赖项完整性
虽然日志显示DLL被加载,但可能存在依赖缺失导致类无法初始化。可以通过以下方式检查:- 使用Dependency Walker工具扫描
Datacollector.dll,确认所有依赖的第三方DLL都存在于C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\Extensions\TestPlatform\Extensions目录或系统环境路径中。 - 附加调试器到
testhost.net48.x86.exe进程,查看加载DLL时是否有隐藏的异常抛出。
- 使用Dependency Walker工具扫描
适配TestPlatform接口变更
VS2019的TestPlatform相比VS2012有较大更新,确认你的DataCollector实现了正确的接口:- 针对.NET Framework,需继承
Microsoft.VisualStudio.TestTools.Execution.DataCollector基类或实现IDataCollector接口。 - 检查接口方法的签名是否符合新版本要求,比如异步方法的实现规范。
- 针对.NET Framework,需继承
手动注册DataCollector
尝试在TestPlatform的配置目录中手动添加采集器清单:- 进入路径
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\Extensions\TestPlatform\Extensions\datacollector.manifests - 创建
CatchEventsCollector.manifest文件,内容如下:<?xml version="1.0" encoding="utf-8"?> <ExtensionManifest xmlns="http://microsoft.com/schemas/VisualStudio/TestPlatform/2014"> <DataCollector friendlyName="CatchEventsCollector" uri="datacollector://TestCompany/FfbeTestFramework/1.0" assemblyQualifiedName="Datacollector.CatchEventsCollector, Datacollector, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxx"> <Configuration /> </DataCollector> </ExtensionManifest> - 重新运行测试命令,查看是否能识别采集器。
- 进入路径
检查平台位数匹配
确保测试项目的目标平台(x86/x64)与testhost进程一致:- 在runsettings中添加
<TargetPlatform>x86</TargetPlatform>指定位数 - 或在vstest命令中加入
/Platform:x86参数
如果你的DLL是x86编译,但testhost运行在x64模式下,会导致类无法正常加载。
- 在runsettings中添加
排查详细加载日志
现有日志仅显示DLL被加载,无法看到类初始化的细节:- 在vstest命令中添加
/Blame参数,生成更详细的错误追踪信息 - 附加调试器到testhost进程,在DataCollector的构造函数中设置断点,确认是否被调用;若未调用,检查是否有异常阻碍了类的实例化。
- 在vstest命令中添加
内容的提问来源于stack exchange,提问作者Kieler1982
相关产品推荐
相关产品推荐

