Microsoft.NET.Test.Sdk与<EnableComHosting>true是否互斥?COM插件如何运行单元测试
关于EnableComHosting与Microsoft.NET.Test.Sdk的互斥问题
两者存在默认生成逻辑冲突。原因是Microsoft.NET.Test.Sdk会默认覆盖项目的输出类型和宿主生成逻辑,将项目识别为测试项目优先生成测试相关宿主,跳过COM宿主的生成流程,才会出现添加Test.Sdk后.comhost.dll消失的情况。
可行的解决方案
方案1:拆分项目结构(最推荐,无冲突)
- 将COM插件的核心业务逻辑、测试用例单独拆到一个类库项目中,该类库不启用
EnableComHosting,按需引用Microsoft.NET.Test.Sdk和测试框架 - 单独创建一个COM插件启动项目,仅保留插件注册、入口逻辑,引用上述核心类库,仅在该启动项目中配置
<EnableComHosting>true</EnableComHosting>,不引用任何测试相关SDK - 运行集成测试时,在插件入口中直接加载核心类库的测试程序集执行测试即可,两个项目的输出可以配置到同一个目录规避文件缺失问题
方案2:修改项目配置强制同时生成COM宿主和测试依赖
在你的插件项目的.csproj文件中添加如下配置,强制保留COM宿主生成逻辑:
<PropertyGroup> <EnableComHosting>true</EnableComHosting> <!-- 强制生成comhost,不被Test.Sdk的逻辑覆盖 --> <GenerateComHost>true</GenerateComHost> <GenerateTestHost>true</GenerateTestHost> </PropertyGroup>
添加完成后重新安装Microsoft.NET.Test.Sdk包,重新生成后.comhost.dll和testhost.dll会同时出现在输出目录。
方案3:使用独立测试运行引擎规避testhost.dll依赖
你当前使用的AssemblyRunner依赖Visual Studio测试平台的testhost组件,可以替换为xUnit或者NUnit的自托管运行API,不需要依赖Microsoft.NET.Test.Sdk就能直接在进程内发现和执行测试:
以xUnit为例,直接引用xunit.core和xunit.execution.desktop包,不需要引用Test.Sdk,用如下代码执行测试即可:
using Xunit; using Xunit.Abstractions; var diagnosticMessageSink = new MessageSinkWithTypes(); var discoveryOptions = TestFrameworkOptions.ForDiscovery(); using var framework = new XunitFramework( AppDomain.CurrentDomain, _assemblyPath, configFile: null, shadowCopy: false, shadowCopyFolder: null, diagnosticMessageSink: diagnosticMessageSink); var discoverySink = new TestDiscoverySink(); framework.Discover( discoveryOptions, includeSourceInformation: true, discoverySink); discoverySink.Finished.WaitOne(); // 后续执行测试用ExecutionSink即可
这个方案完全不依赖testhost.dll,不会和COM宿主生成逻辑产生任何冲突。
手动复制testhost.dll无效的原因
你手动复制的testhost.dll和当前项目的运行时版本、目标框架不匹配,同时缺少配套的.deps.json和.runtimeconfig.json配置文件,测试平台无法正确初始化运行环境,所以依然发现不了测试。
内容的提问来源于stack exchange,提问作者Curdie
相关产品推荐
相关产品推荐

