包含SQLite.Interop.dll的发布项目失败,因为它正由另一个进程使用

时间:2017-01-13 10:49:23

标签: c# asp.net .net sqlite visual-studio-2013

我们最近将SQLite添加到C# WebForms上运行的现有IIS应用中,我们现在无法从Visual Studio或{{}发布该应用{1}}。

如果我们尝试在用户访问后再访问Team City的路由后发布,则会收到以下错误:

  

无法添加' bin / x86 / SQLite.Interop.dll'到网站。无法添加文件' bin \ x86 \ SQLite.Interop.dll'。该进程无法访问该文件,因为它正由另一个进程使用。

为了尽量减少问题范围,我执行了以下步骤:

  1. 创建了新的SQLite DB
  2. 添加了C# Web API project.
  3. 添加了以下代码。
  4. 添加了发布配置文件以发布到本地文件系统并发布。
  5. 执行以下System.Data.SQLite.Core NuGet package.命令IISExpress
  6. 导航至浏览器中的iisexpress /path:c:\path-to-application /port:8081,该http://localhost:8081/api/values使用相关SQLite table
  7. 中的行正确回复

    如果我们再次尝试发布,则会收到上述错误,这与我们在IIS下的生产中看到的问题相呼应。

    为了成功部署到生产站点,我们必须停止app pool,发布然后重新启动app pool

    这远非理想。关于我们如何解决这个问题的任何想法?

    这是代码......

    public IEnumerable<string> Get()
    {
        var dbPath = HttpContext.Current.Server.MapPath("~/MyDB.sqlite");
        using (var conn = new SQLiteConnection(string.Format("Data Source={0};Version=3;", dbPath)))
        {
            var rows = new List<string>();
            conn.Open();
            var sql = "select * from myTable";
            using (var command = new SQLiteCommand(sql, conn))
            {
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        rows.Add(reader["mycolumn"].ToString());
                    }
                }
            }
            return rows;
        }
    }
    

1 个答案:

答案 0 :(得分:1)

您必须在部署期间停止该网站。您应该已经完成​​无论如何,与DLL锁定无关,因为在部署期间处理的请求将产生混合旧代码和新代码的不可预测的结果。