gpt4 book ai didi

c# - 用于 x86/x64 架构的 SQLite dll

转载 作者:IT王子 更新时间:2023-10-29 06:18:39 27 4
gpt4 key购买 nike

我正在 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'

有没有办法只使用一个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

如何更改它以在 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

最佳答案

从 .NET 程序集使用 SQLite 有多种选择。您的第一步是迁移到比旧的 1.0.65 版本更新的版本。当前版本可从此处下载:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki或通过 SQLite NuGet packages .

如果您需要能够在 32 位和 64 位下运行,一种选择是使用本地库预加载选项,您可以在单独的目录中分发本地二进制文件,所以它看起来像这样:

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

另一种选择是构建您的应用的两个版本,并在每个版本中引用适当的混合模式程序集。然后您会得到两个版本,但它们的处理起来更简单一些,因为您不需要额外的子目录和 native *.Interop.dll。

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

最后一个选择是使用名为 C#-SQLite 的托管克隆:https://code.google.com/p/csharp-sqlite/ .它是 SQLite 引擎到托管 C# 的一个端口,所以整个东西作为 AnyCPU 运行,位数不是问题。

关于c# - 用于 x86/x64 架构的 SQLite dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18163354/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com