14

VB.net でプログラムを開発し、 .NET 用のSystem.Data.SQLiteプリコンパイル済みバイナリを使用していますが、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'

おそらく、1つのdllのみを使用する方法はありますか:

  1. #IFDEF (x86 にはコードの一部が含まれる) または x64 コードなどのディレクティブを追加します。
  2. dll を結合して 1 つだけにします。
  3. VB.netでこのdllを参照してください

x32用とx64用ではなく、コンパイルを1つだけ作成したいので、他のより良いアイデアだと思いますか。

たとえば (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
4

5 に答える 5

6

私は数年前に同じ問題を抱えていましたが、私にとって最良の解決策は次のとおりです。

  • ライブラリの最新バージョンをダウンロードする
  • あなたのビンのパスSystem.Data.SQLite.dllSystem.Data.SQLite.Linq.dll
  • x86SQLite.Interop.dllライブラリを入れますc:\Windows\SysWOW64
  • x64SQLite.Interop.dllライブラリを入れますc:\Windows\System32
  • Any CPUプロジェクトを参照のみとしてコンパイルしますSystem.Data.SQLite(dllをbinパスに)
  • 楽しい

このようにして、.NET フレームワークは、GAC などに何も登録することなく、実行時に正しい (x86 と x64) ライブラリを自動的にロードします。

お役に立てれば。

于 2013-10-03T06:46:56.593 に答える
1

問題の最新技術は、 Nugetを使用して簡単に解決できます インストール後、次のようにSQLiteを検索します。

PM> Install-Package System.Data.SQLite 

私は真新しいコンピューターとVSを使用してこれを行いました.SQLiteが必要で、これを行ったところ、すべて正常に機能しました.

于 2015-11-25T17:26:13.997 に答える
1

いいえ、ありません。

これは、これらの *.dll がネイティブ c/c++ *.dll の単なるラッパーであるためです。また、32 ビットの .NET アプリケーションは 32 ビットの c/c++ dll を使用する必要があり、64 ビットの .NET アプリケーションは 64 ビットの c/c++ dll を使用する必要があります。

私は長い間 vb.net を使用していません。C# でできるようにターゲット プラットフォームを構成できるかどうかわかりません。可能であれば、そうし、適切な相互運用 dll を使用する必要があります。また、32 ビットまたは 64 ビットのどちらが必要かを決定する必要があります。

于 2013-10-01T12:47:25.213 に答える