安装后无法加载DLL'e_sqlite3'

时间:2018-07-18 23:12:43

标签: c# wpf sqlite installer

我遇到了这个异常

DllNotFoundException: Unable to load DLL 'e_sqlite3': The specified module could not be found. (Exception from HRESULT: 0x8007007E

在此行:

SQLiteConnection connection = new SQLiteConnection(App.databasePath)

所以,我有一个带有本地数据库的简单CRUD应用程序。一切都可以在AnyCPU,x86和x64的Debug甚至Even release构建模式下正常工作,但是当我使用Visual Studio安装程序制作安装程序时,此问题开始。我通过添加项目输出文件(主输出)+应用程序图标和空的数据库文件来做到这一点。

在我使用安装程序安装它后,出现该错误。如我所说,在Visual Studio中,它运行良好。

编辑:看来我正在寻求解决方案。现在我看到在调试版本中,我有2个文件夹x86和x64以及该文件,而在安装文件夹中我没有​​创建文件夹和文件的权限?我该如何解决?

3 个答案:

答案 0 :(得分:0)

您需要将x86的项目构建设置为x64SQLite3。 x86路由将具有更大的兼容性,因此,除非您执行某些特定的64位操作,否则请使用该选项。 还请确保在属性工具窗口中将SQLite3的副本设置为输出以始终复制。 并确保如上所述将您的项目设置为x86选项。

答案 1 :(得分:0)

首先了解一些背景。

与常规DLL不同,.NET DLL实际上并不包含在目标计算机上运行的代码。 AnyCPU / x86 / x64标志指示DLL支持哪些平台,但是指令本身是通用中间语言字节码。 .NET JIT编译器需要在运行时加载DLL并根据应用程序是以32位还是64位模式运行来生成实际的汇编指令。

回到您的问题。您同时拥有x86和x64 DLL的事实向我暗示您使用的是SQLite版本,其中他们提供了分别设置32位和64位标志的单独DLL。如果您的应用程序针对一个或另一个,那么您要做的就是将适当的版本添加到您的项目中,然后在文件属性中将“构建操作”设置为“无”,并将“复制到输出目录”设置为“如果更新则复制” “。

如果您的项目是使用AnyCPU构建的,则必须将两个文件都添加到项目中,如果文件名相同,则使用不同的子文件夹。然后,在执行任何SQLite操作之前,您将必须在运行时确定您的应用运行的是32位还是64位模式,并手动加载适当的DLL。 This article显示了将执行此操作的一些代码,它仅查看IntPtr.Size的值来确定模式并调用Assembly.LoadFrom()进行加载。加载后,所有其他SQLite命令将正常运行。

然而,最好,最简单的解决方案是只使用对32位和64位都设置了标志的SQL版本。为此,您需要回顾一下SQLite下载页面,或者通过右键单击yoru项目,选择“管理NuGet程序包”,单击“浏览”并选择“ System.Data.SQLite”项目。

答案 2 :(得分:-1)

ch笔记 Chilkat软件技术说明

非Windows系统(Linux,iOS,MacOSX等)上的HTTP“管道中断”错误 HomeUncategorized在非Windows系统(Linux,iOS,MacOSX等)上的HTTP“断线”错误
2019年9月6日
非Windows系统(Linux,iOS,MacOSX等)上的HTTP“管道中断”错误 如果您在发送HTTP请求的方法的任何LastErrorText中看到错误行“据我们所知连接已经存在。”,后跟“ socketError:断开的管道”,则表示以下内容:服务器已回复上一个没有“ Connection:close”标头的请求,因此允许客户端为下一个请求保持连接打开状态。但是,当客户端(Chilkat)发送下一个请求时,该连接实际上已关闭(因此,“管道中断”)。

解决方案:应该在Chilkat v9.5.0.79及更高版本中解决此问题。 Chilkat将自动(内部)重新连接到服务器,然后发送请求。

  FullRequestBd:
    DllDate: Mar 13 2019
    ChilkatVersion: 9.5.0.77
    UnlockPrefix: 
    Architecture: Little Endian; 64-bit
    Language: Cocoa Objective-C
    VerboseLogging: 0
    uriPath: ***
    fullRequestBody:
      autoReconnect: 1
      Sending request with body...
      sendReqBody:
        sendReqHeader:
          omitContentType: 0
          sendReqHeader2:
            checkEstablishConnection:
              The connection already exists, as far as we know..
            --checkEstablishConnection
            addAuthAws:
              AwsSignatureVersion: 4
              buildAwsCanonicalQueryParams:
                queryParams: 
                canonicalizedQueryParams: 
              --buildAwsCanonicalQueryParams
              awsAuthHeaderV4:
                finalSignature: ***
                authHeaderValue: AWS4-HMAC-SHA256 Credential=xxx/yyy6/eu-west-3/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=***
              --awsAuthHeaderV4
            --addAuthAws
          --sendReqHeader2
        --sendReqHeader
        Error sending on socket (1)
        socketErrno: 32
        socketError: Broken pipe
        send_size: 16413
        Failed to send TLS message.
      --sendReqBody
    --fullRequestBody
    Failed.
  --FullRequestBd