System.Data.SQLite.dll不能編譯成AnyCPU問題的解決方案,以及它跨x86和x64的使用方法。


        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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM