我在Azure上有一个使用dll的WebApp。该库需要Interop库x86和x64。 有时,在重新启动应用程序时(我猜),应用程序因异常而失败:
System.EntryPointNotFoundException: Unable to find an entry point named 'sqlite3_config' in DLL 'SQLite.Interop.dll'. at System.Data.SQLite.UnsafeNativeMethods.sqlite3_config_none(SQLiteConfigOpsEnum op) at System.Data.SQLite.SQLite3.StaticIsInitialized() at System.Data.SQLite.SQLiteLog.Initialize() at System.Data.SQLite.SQLiteConnection..ctor(String connectionString, Boolean parseViaFramework) at T_Dox.WebService.SQLiteDb.CreateConnection() at WebService.CeDb.Connect()
使用的SQLite是SQLCipher的。 我在这里错过了什么?我不明白为什么即使我没有做任何改动,应用程序也会突然停止工作。
App是一个Web服务(.asmx文件),它使用数据访问层来执行某些业务逻辑。
它是在一个网站项目下,然后我们将它移动到另一个项目,一个webapi \ mvc项目。 路由绕过此扩展,因此它像以前一样工作,这是一个简单的Web服务调用。
被调用的Web方法初始化从另一个.net库(VB.Net库)加载的业务类。 在里面,这个类使用sqlConnection的包装器,在本例中是SQLiteConnection。 在它的构造函数中,它启动一个SQLiteConnection,通常它可以工作。 然后它执行一些CRUD操作......
所以我可以用这种方式表示操作:
[WebService(Namespace = "...")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class SampleService : System.Web.Services.WebService
{
[WebMethod]
public ServerInfo Test()
{
var sampleBusinessClass = new SampleBusinessCLass();
sampleBusinessClass.DoSomething();
using(var connection = new SQLiteConnection()) //the constructor is the parameterless one
{
//...
}
}
}
堆栈就是这个(这不是真正的堆栈):
System.EntryPointNotFoundException: Unable to find an entry point named 'sqlite3_config' in DLL 'SQLite.Interop.dll'.
at System.Data.SQLite.UnsafeNativeMethods.sqlite3_config_none(SQLiteConfigOpsEnum op)
at System.Data.SQLite.SQLite3.StaticIsInitialized()
at System.Data.SQLite.SQLiteLog.Initialize()
at System.Data.SQLite.SQLiteConnection..ctor(String connectionString, Boolean parseViaFramework)
at xxx.WebService.SampleService.Test()
它始终有效,但有时它会一直启动此错误,直到在iss上停止和启动Web应用程序(在我们的例子中:Azure)。
检查System.Data.SQlite.dll我可以清楚地看到入口点,实际上它总是通过这个内部代码(没有可以绕过这部分的条件),它通常可以工作。
System.Data.SQlite.dll(1.0.96.0版)由SqlCypher产品提供。我认为这是原始的System.Data.SQLite,因为乍一看我可以看到相同的程序集清单和内容。 Interop System.Data.SQLite使用的可能是由SqlCypher团队修改来提供它们的功能。 为了避免可能的问题,我们将interop放在路径/ bin / x64中,然后我们仅在x64中编译我们的Web应用程序,它在x64环境中运行。