运行多个MS测试时调用FoxPro DLL出现COM Exception求助
问题分析与解决方案
核心原因推测
- FoxPro的COM组件大概率非线程安全,并行运行测试时多线程同时实例化/访问组件,引发资源冲突
- 现有
Dispose实现存在缺陷:终结器调用Dispose未做线程安全处理,且未抑制终结器,可能导致重复释放;close()调用后未显式释放COM对象的Runtime Callable Wrapper(RCW),导致资源未及时回收
具体修复方案
1. 禁用测试并行执行
如果组件不支持多线程,强制测试串行运行:
- 编辑测试项目的
.runsettings文件,添加配置:
<RunSettings> <RunConfiguration> <MaxCpuCount>1</MaxCpuCount> </RunConfiguration> </RunSettings>
- 或在测试资源管理器中右键测试项目,选择「运行设置」→「禁用并行测试」
2. 修正IDisposable模式实现
确保COM对象被及时、安全释放:
public class TestWrapper : IDisposable { private ibsitest poTest; private bool _disposed = false; public TestWrapper() { poTest = new ibsitest(); } protected virtual void Dispose(bool disposing) { if (!_disposed) { if (disposing) { // 释放托管资源(如有) } // 释放非托管COM资源 if (poTest != null) { poTest.close(); System.Runtime.InteropServices.Marshal.ReleaseComObject(poTest); poTest = null; } _disposed = true; } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } ~TestWrapper() { Dispose(false); } }
3. 每个测试用例独立管理实例
确保测试间实例完全隔离,使用using语句自动释放:
[TestClass] public class MyTests { [TestMethod] public void TestCase1() { using (var wrapper = new TestWrapper()) { // 测试逻辑 } } [TestMethod] public void TestCase2() { using (var wrapper = new TestWrapper()) { // 测试逻辑 } } }
4. 强制资源回收(可选)
在测试清理阶段添加资源回收逻辑,确保前一个实例完全释放:
[TestCleanup] public void Cleanup() { GC.Collect(); GC.WaitForPendingFinalizers(); Thread.Sleep(500); // 根据实际情况调整延迟时长 }
内容的提问来源于stack exchange,提问作者Ak C
相关产品推荐
相关产品推荐

