1

"C# - ANY CPU" で SQLiteSQL Server CEのような 32 ビット バージョンと 64 ビット バージョンの両方を持つ組み込みデータベースを使用しようとしましたが、

[どちらも、32 ビット バージョンと 64 ビット バージョンの XCOPY 展開を提供します。

次のリンクを確認してください: -sql server ce private installation- -XCOPY deployment with sqlite- ]

「32 ビット優先」をチェックすると、XCOPY デプロイメントが機能しないことに気付きました。その場合、プロセスは 64 ビットではありませんが、x64 フォルダーから ddl をロードしようとするとクラッシュします。

「32 ビットを優先」のチェックを外すと、64 ビットとして動作し、適切な dll も検出されます。

プロジェクトをx86にしたとしても、それも機能し、x86 の下で適切な ddls を見つけます。

「32ビットを優先する」コンパイルオプションがこの動作をするのはなぜですか? バグですか?

4

3 に答える 3

3

「Prefer 32 bit」の主な目的は、「CPU Any」設定でより優れたプロセッサーをサポートすることです。

.NET 4.5およびVisual Studio 11の時点でAnyCPUが実際に意味するものから

したがって、「任意の CPU 32 ビット優先」と「x86」の違いはこれだけです。x86 にコンパイルされた .NET アプリケーションは ARM Windows システムでは実行できませんが、「任意の CPU 32 ビット優先」アプリケーションは実行できません。正常に実行されます。

x64 プロセッサでこのオプションを設定することは、基本的に x86 コンパイル オプションを使用することと同じです。

于 2013-07-25T20:50:25.527 に答える
3

ヒッピアスマイナーの問題を確認できます-頭痛の原因にもなりました。SQLite は、実行時にロードするネイティブ DLL (x64 または x86 ディレクトリの SQLite.Interop.DLL) を選択するマネージ ライブラリで構成されます。この方法では、ネイティブ ライブラリを埋め込む必要はありません (したがって、より移植性が高くなります。同じ「xcopy 展開」が異なるアーキテクチャで機能します)。これは、通常、NuGet から SQLite をインストールする方法でもあります。

「x86」と「32ビットを優先する任意のCPU」の違いは(ARMで実行できることに加えて)、最初は環境変数PROCESSOR_ARCHITECTUREを「x86」に設定し、2番目は「AMD64」に設定することです。 ! この問題は次の場所で説明されています: PROCESSOR_ARCHITECTURE は、一部の 32 ビット プロセスで AMD64 を返します。

したがって、SQLite (ヒューリスティックとしてそれを使用) は 64 ビットの相互運用 DLL をロードしようとしますが、実際には 32 ビット プロセスとして実行されているため、失敗します。

回避策として、Environment.Is64BitProcess を確認し、それが false の場合は、環境変数を手動で "x86" に変更します。

于 2013-08-01T12:53:19.933 に答える
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コードが機能するように見える前に。

于 2013-08-01T13:01:53.013 に答える