【问题标题】:SQLite.Interop.dll locked after running Visual Studio 2012 Unit Test Framework testsSQLite.Interop.dll 在运行 Visual Studio 2012 单元测试框架测试后被锁定
【发布时间】:2012-10-06 19:59:48
【问题描述】:
  • 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(而不是工厂)......仍然是同样的问题

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

【问题讨论】:

  • 您能否在 conn.open 周围包裹一个 Try Catch 并查看您试图维持该连接的错误是什么......?如果是这样,则在连接后应该将其处理为您将其包裹在 using{}
  • 我已经尝试过了……但是这个错误是 BUILD 错误……不是运行时错误……它只发生在你“运行”测试之后,之后它会出现 Visual Studio仍然有东西打开,库文件被锁定
  • 它在哪一行出错..? using(var fact = new SQLiteFactory())
  • 你能粘贴配置部分的样子吗?应该是这样的 系统数据>
  • 没有 app.config ... 这是完整的错误“警告 1 无法复制“D:\Code\Test.Sqlite\Test.Sqlite\x86\SQLite.Interop.dll”到“bin\Debug\x86\SQLite.Interop.dll”。在 1000 毫秒内开始重试 1。进程无法访问文件 'bin\Debug\x86\SQLite.Interop.dll',因为它正被另一个进程使用。测试.Sqlite"

标签: c# sqlite unit-testing visual-studio-2012 dispose


【解决方案1】:

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

您可能还想尝试使用 SQL Lite 的数据适配器 Using SQLitew with .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

【讨论】:

  • 是的,尝试了同样的问题......我认为这与 Visual Studio 单元测试框架运行器有关......当你执行'时,它一定不能正确关闭 sqlite.interop.dll全部运行'
  • 我添加了另一个链接 Using SQLLite with .NET
【解决方案2】:

试试这个:

  • 在 VS.NET 中,单击工具\选项
  • 出现对话框时,点击“测试工具”
  • 点击“测试执行”
  • 取消选中“在测试之间保持测试执行引擎运行”复选框
  • 单击确定并重新启动 VS.NET

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

【讨论】:

  • VS2010中存在此设置,VS2012中没有,因此与此特定问题无关。
  • 我实际上是在寻找 VS2010 的答案并最终来到这里。不管怎样,这个答案在 VS2010 中对我不起作用。
  • 在 VS2013 中,该位置位于工具 > 选项 > Web 性能测试工具 > 测试执行中
【解决方案3】:

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

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

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

【讨论】:

  • 不幸的是,如果 SQLite 被测试依赖项而不是测试程序集本身引用,这将不起作用。
  • 为我的设置工作。 sqlite 由测试包引用。
  • 这是唯一适用于VS2013的答案,所以请将其标记为正确答案。唯一的方法是避免将 .dll 复制到输出文件夹中。
  • 我想知道为什么当我有类似的项目引用 System.Data.SQLite 时,我开始在一个新项目中遇到这个问题。区别?这是我通过 nuget 包设置的。你完全正确。在我的测试项目中,我只是将 x86/x64 SQLite.Interop.dll 文件设置为 CopyIfNewer。谢谢!
  • @DevLeader,如何使用 NuGet 将选项设置为 CopyToOutputDirectory?我只能将 Copy Local 设置为 true 或 false..
【解决方案4】:

workaround provided by Philipp Aumayr(将CopyToOutputDirectory 选项设置为PreserveNewest 而不是默认的Always)适用于大多数情况,但不幸的是,并非所有情况。正如关于 SO 的其他问题所指出的那样,vstest.executionengine does not terminate 是 VS2012 中的一个常见问题 - 更糟糕的是,Microsoft 开发人员将此视为 功能设计。防止这种行为的选项在 VS2010 中存在,但在 VS2012 中已被删除。

如果您对此“改进”也有疑问,请对 Microsoft Connect 支持问题 vstest.executionengine.x86.exe (32 bit) - Not Closing 投票(尽管标题如此,但同时影响 x86 和 x64)。

【讨论】:

    【解决方案5】:

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

    对于 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" 会阻止命令(以及构建)失败。

    【讨论】:

    • 对我来说,发现引擎才是问题所在。所以我使用了这一行:taskkill /F /IM vstest.discoveryengine.x86.exe /FI "MEMUSAGE gt 1"
    • 这也为我解决了这个问题。看来这应该被标记为正确答案。
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

          private void Dispose(bool disposing)
          {
              if (_disposed) return;
      
              if (disposing)
              {
                  if (_dbConnection != null)
                  {
                      _dbConnection.Cancel();
                      _dbConnection.Close();
                      _dbConnection.Dispose();
                  }
              }
      
              _disposed = true;
          }
      

      【讨论】:

        【解决方案8】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-22
          • 2014-09-07
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多