Data.SQLite.dll可以認為是對用C編寫的sqlite3.c的.NET平台的封裝,由於原sqlite3.dll是區分x86和x64發布的,Data.SQLite.dll一般也會區分x86和x64封裝,結果可能會在實際使用時產生麻煩。
從Data.SQLite.dll的原始碼中可以知道,其解決方案中保含兩部分的項目,一部分是C#項目,會被產生Data.SQLite.dll和Data.SQLite.Linq.dll;另一部分是C/C++項目,會被產生SQLite.Interop.dll。如果對原始碼進行某些配置,結果會產生一個檔案,即我們常用的Data.SQLite.dll,這可以從官方網站中的那些標著“bundle”字樣的檔案中可以看出,而沒有這個字樣的檔案,其中會包含SQLite.Interop.dll。在這兩個部分中,C#部分中的“UnsafeNativeMethods.cs”檔案中定義了兩個部分的關係,即在此檔案中通過DllImport來匯入SQLite.Interop.dll,而路徑可以是目前的目錄下,或者目前的目錄的Win32、x86、x64等目錄之下。這些就是Data.SQLite.dll的基本內部結構。
Data.Sqlite.dll的原始碼中使用了兩種C/C++和C#的互動方式,都可以達到在.NET平台利用C/C++代碼的目的。一種是以C#代碼為主體,匯入C/C++ dll的方式,這樣會產生多個dll。另一種以C/C++代碼為主體,匯入C# module的方式,這樣只會產生一個dll。
由於解決方案中存在C/C++項目,這是不能夠產生AnyCPU的,所以引用該dll的程式,如果必須要求產生在AnyCPU中的話,該dll的使用將會出現問題。至今發現的唯一一種解決方案是,把C#項目產生的Data.SQLite.dll、x64目錄下的x64版本的SQLite.Interop.dll、x86目錄下的x86版本的SQLite.Interop.dll組合在一起使用。使用時,只需要引用Data.SQLite.dll,它的內部會根據當前平台的不同而調用不同的SQLite.Interop.dll,從而達到對AnyCPU都相容的目的。
上面所說的方法可以達到跨x86和x64平台的目的,不過如果引用該dll的程式不必要一定在AnyCPU下產生,還有一個更方便的方法,把引用該dll的程式在x86下產生,dll只用已經發布了的32平台的版本即可。
其它可能出現的問題,例如Debug下正常而Release下不正常、Console下正常而WinForm下不正常、Win32下正常而Win64下不正常等等,如果可以接受用不最佳化的Debug版本,或者不使用Winform形式的程式,或者只在一個平台下使用,就不必像我說的那樣複雜,如果要求很嚴格,可以試試我在上面所說的方案。
All Comments are Welcome.