适用于x86/x64体系结构的SQLite dll

cMi*_*nor 14 c# vb.net sqlite dll

我正在VB.net中开发一个程序,并使用System.Data.SQLite预编译的二进制文件用于.NET,但它不适用于x64架构,我得到了经典的文化问题而没有加载正确的文件.

System.BadImageFormatException: 
Could not load file or assembly 'System.Data.SQLite, Version=1.0.65.0, Culture=neutral,
 PublicKeyToken=db937bc2d44ff139' or one of its dependencies. An attempt was made to load a program with an incorrect format.
File name: 'System.Data.SQLite,
 Version=1.0.65.0,
 Culture=neutral, 
 PublicKeyToken=db937bc2d44ff139'
Run Code Online (Sandbox Code Playgroud)

有没有办法只使用一个dll,可能:

  1. 添加一些指令,如#IFDEF(x86包含部分代码)或x64代码
  2. 加入dll只做一个.
  3. 在VB.net中引用此dll

你认为是其他更好的想法,因为我只想制作一个编译,而不是x32和x64的其他编辑.

例如(32位):

Private Shared Sub OpenConection(ByRef Conn As SQLite.SQLiteConnection)
    Conn = New SQLite.SQLiteConnection("Data Source=" & System.Environment.CurrentDirectory & "\database.db")
    Conn.Open()
End Sub

Private Shared Sub CloseConection(ByRef Conn As SQLite.SQLiteConnection)
    Conn.Close()
    Conn.Dispose()
    Conn = Nothing
End Sub

Public Shared Function ReturnSelect(ByVal DataTAbleName As String, ByVal sQuery As String, ByVal sWhere As String) As Data.DataTable
    Dim lDT As New DataTable
    Dim lTA As New SQLite.SQLiteDataAdapter
    If DataTAbleName Is Nothing Then Return New DataTable(DataTAbleName)
    Try
        OpenConection(conexion)
        lTA = New SQLite.SQLiteDataAdapter("SELECT " & sQuery & " FROM  " & DataTAbleName & IIf(sWhere <> String.Empty, " WHERE ", "") & sWhere, conexion)
        lTA.Fill(lDT)
    Catch ex As Exception
        Throw ex
    Finally
        CloseConection(conexion)
        lTA.Dispose()
        lTA = Nothing
    End Try
    Return lDT
End Function
Run Code Online (Sandbox Code Playgroud)

如何改变它在64位架构上工作?也许包括32和64 dll,并在函数中执行类似的操作

Try
    Instance = Me
    'Check If Homidom Run in 32 or 64 bits
    If IntPtr.Size = 8 Then _OsPlatForm = "64" Else _OsPlatForm = "32"
    'continue code

Catch ex As Exception
    ' ex.Message
End Try
Run Code Online (Sandbox Code Playgroud)

Gov*_*ert 24

从.NET程序集中使用SQLite有多种选择.你的第一步是转向比古老的1.0.65版本更新的东西.当前版本可以从这里下载:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki或通过SQLite NuGet包.

如果您需要能够在32位和64位下运行,一个选项是使用本机库预加载选项,您可以在其中将本机二进制文件分布在不同的目录中,以便它看起来像这样:

  • \ App.exe(可选,仅管理应用程序可执行程序集)
  • \ App.dll(可选,仅限托管的应用程序库程序集)
  • \ System.Data.SQLite.dll(必需的,仅限托管的核心程序集)
  • \ System.Data.SQLite.Linq.dll(可选,仅限托管的LINQ程序集)
  • \ x86\SQLite.Interop.dll(必需,x86原生互操作程序集)
  • \ x64\SQLite.Interop.dll(必需,x64本机互操作程序集)

另一种选择是构建两个版本的应用程序,并在每个版本中引用相应的混合模式程序集.然后你会得到两个版本,但是由于你不需要额外的子目录和native*.Interop.dlls,所以它们更容易处理.

在这些情况下,您不需要代码差异或32位和64位之间的可选编译.从不同的NuGet包安装可能会让您最轻松地入门.

最后一个选项是使用名为C#-SQLite的托管专用克隆:https://code.google.com/p/csharp-sqlite/.它是管理C#的SQLite引擎的一个端口,因此整个事情以AnyCPU运行,并且位数不是问题.


Tob*_*bon 6

几年前我遇到了同样的问题,对我来说最好的解决方案是:

  • 下载最新版本的库
  • 在你的bin路径中只放入System.Data.SQLite.dll并最终System.Data.SQLite.Linq.dll
  • 将x86 SQLite.Interop.dll库放入c:\Windows\SysWOW64
  • 将x64 SQLite.Interop.dll库放入c:\Windows\System32
  • 将您的项目编译为Any CPU仅引用System.Data.SQLite(将dll放入bin路径)
  • 请享用

通过这种方式,.NET框架将在运行时自动加载正确的(x86 vs x64)库,而无需在GAC或类似的程序中注册任何内容.

希望这可以帮助.

  • 为什么这是接受的答案?在系统文件夹中抛出库,严重吗?这将使其成为部署的噩梦. (9认同)
  • 它是正确的,两个库是相同的,我用文件比较器检查它,你必须下载[this for x86](http://system.data.sqlite.org/downloads/1.0.88.0/sqlite- netFx20-binary-Win32-2005-1.0.88.0.zip)和[this for x64](http://system.data.sqlite.org/downloads/1.0.88.0/sqlite-netFx20-binary-x64-2005-1.0 .88.0.zip) (2认同)