为什么在Azure Functions中使用SQLite会给我一个DLLNotFoundException?

时间:2018-04-06 22:28:12

标签: c# sqlite azure azure-functions

我正在尝试编写一个定时器触发的Azure函数,它可以下载大量数据并将其处理到SQLite数据库中。我编写的代码可以在我自己的机器上运行。但是,Azure中的相同代码会产生DllNotFoundException,抱怨系统无法加载“e_sqlite3”。

以下是完整的错误消息(针对内部异常):

  

执行函数时出现异常:FnordFunction

     

Microsoft.Azure.WebJobs.Host.FunctionInvocationException:Exception   执行功能时:FnordFunction --->   System.TypeInitializationException:类型初始值设定项   'SQLite.SQLiteConnection'引发了异常。 --->   System.DllNotFoundException:无法加载DLL'e_sqlite3':   找不到指定的模块。 (HRESULT的例外情况:   0x8007007E)

     

在   SQLitePCL.SQLite3Provider_e_sqlite3.NativeMethods.sqlite3_libversion_number()

     

在   SQLitePCL.SQLite3Provider_e_sqlite3.SQLitePCL.ISQLite3Provider.sqlite3_libversion_number()

     

在SQLitePCL.raw.SetProvider(ISQLite3Provider imp)

     

在SQLitePCL.Batteries_V2.Init()

     

在SQLite.SQLiteConnection..cctor()

     

内部异常结束

以下是重现的步骤:

  1. 在Visual Studio 2017中,我使用最新模板创建了Azure Function项目。
  2. 我将我的代码文件添加到项目中,并编辑了“Run”方法来调用代码。
  3. 使用NuGet,我添加了sqlite-net-pcl和我需要的其他一些库。 (我也尝试使用EntiteFrameworkCore,使用SQLite;这也不起作用。)
  4. 构建
  5. 发布
  6. 运行。故障。
  7. 问题可能是我的代码错了 - 但是当我只是制作一个控制台.exe时它可以正常工作。

    问题可能是VS2017在构建时没有为SQLite捆绑正确的dll。我不知道如何解决这个问题。我从其他搜索中看到,当平台目标设置为“任何CPU”时会弹出相同的错误消息,但将其更改为x86或x64并不能解决问题。

    问题可能是我尝试过的SQLite库不能在Azure Functions沙箱中运行。如果是这样,是否有任何简单的SQLite库将在沙箱中运行?

    提前致谢...

1 个答案:

答案 0 :(得分:5)

问题是,在功能应用程序中运行时,无法从bin文件夹自动加载本机二进制文件,因此它找不到DLL。

解决此问题的一种方法是将其放入D:\home\site\tools文件夹(例如使用Kudu控制台),因为该文件夹会自动放在PATH上。