2013-07-25 13 views
1

雖然我嘗試使用嵌入式數據庫,該數據庫同時具有32位和64位版本,如SQLite的的SQL Server CE在 「C# - 任何CPU」.NET 4.5具有Perefer 32位選項的「任何CPU」:對於具有32位和64位版本的XCopy的dll不起作用

[兩者都提供了XCOPY部署他們的32個和64位版本。

檢查以下幾個環節:-sql server ce private installation--XCOPY deployment with sqlite-]

我注意到,當我們檢查「首選32位」,XCOPY部署不行,在這種情況下procoess不是64位,但試圖從64位加載DDL文件夾和崩潰。

如果我們取消選中「首選32位」,它可以像64位一樣工作,也可以找到正確的dll。

即使我讓我的項目x86那麼它也可以在x86下找到正確的ddls。

爲什麼「prefer 32 bit」編譯選項有這種行爲?這是一個錯誤嗎?

回答

3

我可以證實Hippias Minor的問題 - 也引起我一些頭痛。 SQLite由一個託管庫組成,該庫選擇在運行時加載哪個本機DLL(或者是x64或x86目錄中的SQLite.Interop.DLL)。這樣就不需要嵌入本地庫(因此更便攜 - 同一個「xcopy部署」可以在不同的體系結構上工作)。這也是SQLite通常從NuGet安裝的方式。

「x86」和「Any CPU w/prefer 32-bit」之間的差異(除了能夠在ARM上運行)之外,第一個將環境變量PROCESSOR_ARCHITECTURE設置爲「x86」,而第二個將設置它到「AMD64」!這裏描述的問題如下:PROCESSOR_ARCHITECTURE returns AMD64 in some 32-bit processes

因此,SQLite(使用它作爲啓發式)會嘗試加載64位互操作DLL,並且因爲它實際上是作爲32位進程運行而導致失敗。

解決方法可能是檢查Environment.Is64BitProcess,如果是false,手動將環境變量更改爲「x86」。

3

「優先32位」的主要目的是通過「CPU任意」設置更好地支持處理器。

What AnyCPU Really Means As Of .NET 4.5 and Visual Studio 11

的差,那麼,「任何CPU 32位優選的」和「86」之間是唯一的這樣的:編譯以x86的.NET應用程序無法爲ARM視窗系統上運行,但「任何CPU 32位首選」應用程序將成功運行。

在x64處理器上設置此選項基本上與使用x86編譯選項相同。

+0

但是,它們在「理論」中似乎是平等的。那麼爲什麼x86和任何具有「喜歡32位」的cpu選項表現不同? –

+0

在步驟編號爲12的第一篇文章中是這樣的消息: 「您可以忽略這些警告,因爲SQL Compact運行時足夠智能,可以爲安裝它的系統選擇正確的支持DLL集。 如果它是一個bug,緊湊運行時可能會考慮它是如何編譯的,而不是它運行的是什麼。換句話說,僅僅因爲它被編譯爲CPU Any並不意味着它將作爲一個64位應用程序運行,如上所述。 – tHand

+0

沒有警告。它只是崩潰。 –

2
if (!Environment.Is64BitProcess 
     && Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") 
      .Equals("AMD64", StringComparison.InvariantCultureIgnoreCase)) 
{ 
// Workaround the "Any CPU" w/ "Prefer 32-bit" option from .NET 4.5+ 
    Environment.SetEnvironmentVariable("PROCESSOR_ARCHITECTURE", "x86"); 
} 

在任何SQLite代碼似乎使事情工作。