私は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つだけ使用する方法はありますか?
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
.NETアセンブリからSQLiteを使用するためのさまざまなオプションがあります。最初のステップは、古代の1.0.65バージョンよりも新しいものに移行することです。現在のバージョンはここからダウンロードできます: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki または SQLite NuGetパッケージを介して 。
32ビットと64ビットの両方で実行できるようにする必要がある場合、1つのオプションはネイティブライブラリのプリロードオプションを使用することです。ネイティブバイナリを個別のディレクトリに配布すると、次のようになります。
別のオプションは、アプリの2つのバージョンをビルドすることです。各バージョンでは、適切な混合モードアセンブリを参照します。その後、2つのバージョンが作成されますが、追加のサブディレクトリとネイティブの* .Interop.dllが必要ないため、処理が少し簡単です。
これらの場合、32ビットと64ビットのコードの違いやオプションのコンパイルは必要ありません。異なるNuGetパッケージからインストールすると、おそらく最も簡単に開始できます。
最後のオプションは、C#-SQLite: https://code.google.com/p/csharp-sqlite/ と呼ばれる管理専用クローンを使用することです。これはSQLiteエンジンをマネージC#に移植したものであるため、すべてがAnyCPUとして実行され、ビット数は問題になりません。
私は数年前に同じ問題を抱えていましたが、私にとって最善の解決策は次のとおりです。
System.Data.SQLite.dll
のみを入れ、最終的にはSystem.Data.SQLite.Linq.dll
を入れてくださいSQLite.Interop.dll
ライブラリをc:\Windows\SysWOW64
に入れますSQLite.Interop.dll
ライブラリをc:\Windows\System32
に入れますAny CPU
のみを参照してプロジェクトをSystem.Data.SQLite
としてコンパイルします(binパスへのdll)このようにして、.NETフレームワークは、GACなどに何も登録せずに、実行時に正しい(x86 vs x64)ライブラリを自動的にロードします。
お役に立てれば。
いいえ、ありません。
これは、これらの* .dllがネイティブc/c ++ * .dllの単なるラッパーであるためです。また、32ビットの.NETアプリケーションは32ビットのc/c ++ dllを使用する必要があり、64ビットの.NETアプリケーションは64ビットのc/c ++ dllを使用する必要があります。
私はvb.netを長い間使用していません。C#のようにターゲットプラットフォームを構成できるかどうかはわかりません。可能であれば、そうする必要があり、適切な相互運用DLLを使用する必要があります。また、32ビットと64ビットのどちらが必要かを決定する必要があります。
@Govertと@TobiaZambonによる他の回答は、正しい方法です。しかし、他の人が読んでいる場合、別のオプションは、System.Data.Sqlite dllのx86バージョンを使用して、x86プラットフォーム用にアプリケーションをコンパイルすることです。つまり、AnyCPUにコンパイルしないでください。つまり、x64マシンウィンドウで実行すると、32ビットモードで実行され、32ビットのdllをロードできるようになります。
これが役立つかどうかは状況によって異なりますが、ワークステーションにデプロイされるアプリを構築する場合は、非常にシンプルなソリューションです。