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

來源:互聯網
上載者:User

        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.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.