2012-12-30 28 views
1

我對典型的LOB應用程序使用Visual Studio 2012。這個應用程序有DAL,BLL和UI層。更好地接受在幾個平臺(ARM,x64和x86)中使用Sqlite?

所有項目,節選sqlite的,是基於便攜式類庫(PCL),所以我可以編譯一次,他們爲所有的平臺上工作。

但是數據庫SQLite的。 Sqlite使用本地代碼,所以我需要爲每個平臺部署一個包。 例如,當我需要爲ARM處理器進行部署時,我需要重新編譯ARM的所有項目(超過20個),因爲Sqlite放置在較低層。大多數項目直接或間接依賴於放置Sqlite的DAL。

這將是解決這種情況下,最好的辦法?

謝謝

回答

1

只要您在您的應用程序本機庫,你需要建立一個單獨的包爲每個平臺,讓每一個包括用於平臺正確的庫。

如果你還沒有使用SQLite for Windows Runtime Visual Studio extension,你應該。它將SQLite添加爲您的添加引用對話框的擴展。如果您將其添加到您的項目中,則每次構建時都會自動包含正確項目的本地庫。

要訪問.NET可以使用sqlite-net這是獨立於平臺的本地庫。

由於您使用PCL,它可能是你不僅對WinRT的編寫你的應用程序。在這種情況下,答案可能並不完全適用,但我需要更多信息才能給出更具體的建議。

+0

我使用SQLite作爲擴展,因此我可以在構建過程中進行一些改進,因爲我可以更改項目平臺而不手動更新對SQLite的引用。但是,使用SQLite的數據訪問項目被其他程序集引用爲BLL等。由於我需要明確定義數據訪問項目的平臺,因此擴展系統無法解決我的問題。也許我需要用我的數據訪問項目創建一種擴展,模仿SQLite使用的系統。順便說一下,我的目標平臺是Windows 8,WinRT和Windows Phone 8. 謝謝 –

+0

@DabielKabuto您可以創建一個帶有數據訪問接口的項目,並通過依賴它的所有其他程序集來引用它。所有這些程序集現在可以保持平臺不可知。對於每個目標平臺,您將使用特定於平臺的代碼實現此接口。在目標平臺的主項目中,引導代碼將確保正確的數據訪問實現將被使用(注入)。這樣,唯一的特定於平臺的項目應該是單個數據訪問實現以及每個目標平臺的主要項目。 –

3

看一看這個web page約SQLite,讓.NET。

有一個版本的SQLite.dll的是平臺無關的。它會動態加載一個附加了特定平臺的本地代碼的DLL。他們提出以下的目錄佈局(您的應用程序目錄內):

System.Data.SQLite.dll (required, managed-only core assembly) 
System.Data.SQLite.Linq.dll (optional, managed-only LINQ assembly) 
x86\SQLite.Interop.dll (required, x86 native interop assembly) 
x64\SQLite.Interop.dll (required, x64 native interop assembly) 

在你的項目,你只添加與平臺無關的,管理的,只有DLL。出於這個原因,你可以編譯一次,它應該在所有平臺上運行。沒有從託管到本地DLL的硬鏈接。這隻能在運行時解決。

希望,這種方法可以擴展到ARM架構。

請不說,該頁還包​​含混合模式的組件,組件對一些VC運行庫等你要避開他們的動態鏈接。他們造成很多頭痛。

+0

'System.Data.SQLite'不能在WinRT中使用,因爲它是一個ADO.NET提供程序,WinRT中沒有可用的ADO.NET。 –

+0

是的,正如Damir所說,這種解決方案在我的方案中無法正常工作。我的目標平臺是Windows 8,WinRT和Windows Phone 8.這種方法,Interop,適用於完整的.Net框架,不適用於WinRT –