繁体   English   中英

运行Visual Studio 2012单元测试框架测试后,SQLite.Interop.dll被锁定

[英]SQLite.Interop.dll locked after running Visual Studio 2012 Unit Test Framework tests

  • Visual Studio 2012
  • SQLite 1.0.82.0(来自nuget)

我试图在“测试资源管理器”中使用“全部运行”命令在运行测试一次之后发生以下错误...之后它将不再构建,直到您重新启动visual studio

这是构建错误

进程无法访问文件'SQLite.Interop.dll',因为它正被另一个进程使用

这是代码

using System.Data.SQLite;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Test.Sqlite
{
    [TestClass]
    public class Test_Sqlite_Locking
    {
        [TestMethod]
        public void can_create_table()
        {
            using(var fact = new SQLiteFactory())            
            using (var conn = fact.CreateConnection())
            {
                conn.ConnectionString = "Data Source=:memory:;Version=3;New=True;";
                conn.Open();
                //conn.Close();                
            }

            //SQLiteConnection.ClearAllPools();
            //GC.Collect();
        }
    }
}

我试过,关闭连接,调用ClearAllPools,GC.Collect,直接创建SQLiteConnection(而不是Factory)...仍然是同样的问题

如果您调试所有测试,这可以工作......但是当您运行测试时,它似乎将其锁定

我在VS2012中找不到该选项(至少不能用于标准单元测试),因此我提出了另一种解决方案:

您遇到的问题来自于单元测试运行器仍然加载,以便重复测试运行更快。 由于SQLite.Interop.dll可能不会经常更改,我将CopyToOutputDirectory选项更改为PreserveNewest而不是默认的Always

您可以通过打开属性(F4)视图并在解决方案中选择SQLite.Interop.dll文件来执行SQLite.Interop.dll操作。 这可能仍会锁定的唯一一次是当您升级到更新版本的SQLite并重新启动VS2012时,对我来说工作正常。

我通过使用以下作为受影响的测试项目的预构建事件来解决这个问题:

对于64位:

taskkill /F /IM vstest.executionengine.exe /FI "MEMUSAGE gt 1"

或32位:

taskkill /F /IM vstest.executionengine.x86.exe /FI "MEMUSAGE gt 1"

在构建测试项目之前,这会默默地杀死执行引擎。 如果执行引擎未运行, /FI "MEMUSAGE gt 1"停止命令(因此构建)失败。

尝试这个:

  • 在VS.NET中,单击Tools \\ Options
  • 出现对话框时,单击“测试工具”
  • 点击“测试执行”
  • 取消选中“让测试执行引擎在测试之间运行”框
  • 单击确定,然后重新启动VS.NET

您应该能够立即运行基于SQLite的测试,而无需重新启动。

在Visual Studio 2013中 - 转到“测试>测试设置>保持测试执行引擎运行”并取消选中它! 适合我。

Philipp Aumayr提供解决方法 (将CopyToOutputDirectory选项设置为PreserveNewest而不是默认的Always )适用于大多数情况,但不幸的是并非全部。 正如SO上的其他问题所指出的那样, vstest.executionengine不会终止这一事实是vstest.executionengine中的一个常见问题 - 更糟糕的是,微软开发人员将此视为一种功能而非设计 VS2010中存在防止此行为的选项,但已在VS2012中删除。

如果你对这个“改进”也有问题,那么请对Microsoft Connect支持问题vstest.executionengine.x86.exe(32位)进行投票- 不关闭 (尽管标题是影响x86和x64)。

我知道这个问题很老,但我遇到了这个问题,这里的一些答案引发了一个想法。 在尝试围绕SQLite构建单元/集成测试时遇到的第一个问题之一是MSTest(我们用于脚本构建)在运行测试之前没有将所有必要的依赖项部署到测试运行的“Out”目录,所以测试失败了。 我发现解决此问题的最佳方法是将这些属性添加到我的测试类:

[TestClass]
**[DeploymentItem("System.Data.SQLite.dll")]
[DeploymentItem("x86\\SQLite.Interop.Dll")]**
public class TestClass

这似乎也解决了这个问题...我猜这会导致VSTest加载这些依赖项的不同副本,以便VSBuild仍然可以执行它在普通/ bin /目录中的副本。

还要确保将数据库安装到正确的文件夹中
SQLite连接字符串

您可能希望使用SQL Lite 使用SQLitew与.NET一起尝试的数据适配器

SQLiteConnectionStringBuilder builder = new SQLiteConnectionStringBuilder();
builder.FailIfMissing = true;
builder.DataSource = "Insert the fully qualified path to your sqlite db";
SQLiteConnection connection = new SQLiteConnection(builder.ConnectionString);
try
{
  connection.Open();
}
catch(SqlException exp)
{
    // Log what you need from here.
    throw new InvalidOperationException("Whatever exception you want to throw", exp);
}

阅读本文,看看它是否有助于纠正您的问题以及System.Data.SQLite.View Ticket

尝试处理如下连接。 它对我来说很好。

    private void Dispose(bool disposing)
    {
        if (_disposed) return;

        if (disposing)
        {
            if (_dbConnection != null)
            {
                _dbConnection.Cancel();
                _dbConnection.Close();
                _dbConnection.Dispose();
            }
        }

        _disposed = true;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM