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

运行多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:20:15