20
  • 视觉工作室 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(而不是工厂)......仍然是同样的问题

如果您调试所有测试,这确实有效......但是当您只是运行测试时,这似乎将其锁定

4

8 回答 8

32

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

您面临的问题来自单元测试运行器保持加载状态,因此重复测试运行速度更快。由于SQLite.Interop.dll可能不会经常更改,因此我将CopyToOutputDirectory选项更改为PreserveNewest而不是默认的Always.

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

于 2012-12-02T11:42:29.173 回答
13

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

对于 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"如果执行引擎未运行,则停止命令(因此构建)失败。

于 2013-02-03T21:41:26.417 回答
8

Try this:

  • In VS.NET, click on Tools \ Options
  • When the dialog appears, click on "Test Tools"
  • Click on "Test Execution"
  • Uncheck the box "Keep test execution engine running between tests"
  • Click OK and restart VS.NET

You should be able run SQLite based tests now without having to restart.

于 2012-11-17T03:02:41.333 回答
4

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

于 2014-02-21T00:37:28.633 回答
2

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

如果您对此“改进”也有疑问,请对 Microsoft Connect 支持问题vstest.executionengine.x86.exe(32 位)- 未关闭(尽管标题影响 x86 和 x64)进行投票。

于 2013-01-08T10:24:49.973 回答
2

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

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

这似乎也解决了这个问题......我猜这会导致 VSTest 加载这些依赖项的不同副本,以便 VSBuild 仍然可以对您的正常 /bin/ 目录中的副本执行其操作。

于 2015-06-22T15:38:42.713 回答
0

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

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

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

        _disposed = true;
    }
于 2014-07-19T02:00:58.523 回答
0

还要确保您的数据库安装到正确的文件夹
SQLite Connection Strings

您可能还想尝试使用 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

于 2012-10-16T18:05:23.120 回答