为什么Azure没有正确加载Interop?

时间:2016-01-28 10:41:41

标签: azure dll interop sqlcipher

我在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环境中运行。

0 个答案:

没有答案