虽然我尝试使用具有 32 位和 64 位版本的嵌入式数据库,例如 SQLite 和 SQL Server CE 在“C# - 任何 CPU”中
[ 两者都为其 32 位和 64 位版本提供 XCOPY 部署。
检查以下链接:-sql server ce private installation- -XCOPY deployment with sqlite- ]
我注意到当我们检查 时“首选 32 位” , XCOPY 部署不起作用,在这种情况下,进程不是 64 位,但尝试从 x64 文件夹加载 ddl 并崩溃。
如果我们取消勾选 “首选 32 位”它可以作为 64 位工作,并且还可以找到正确的 dll。
即使我做我的项目 x86 然后它也可以工作并在x86下找到正确的ddls。
为什么“首选 32 位”编译选项有这种行为?这是一个错误吗?
最佳答案
我可以确认 Hippias Minor 的问题——也让我有些头疼。 SQLite 包含一个托管库,该库选择在运行时加载哪个 native DLL(x64 或 x86 目录中的 SQLite.Interop.DLL)。这样它就不需要嵌入 native 库(因此更便携 - 相同的“xcopy 部署”可以在不同的体系结构上工作)。这也是通常从 NuGet 安装 SQLite 的方式。
“x86”和“任何 CPU 更喜欢 32 位”(除了能够在 ARM 上运行)之间的区别在于,第一个将环境变量 PROCESSOR_ARCHITECTURE 设置为“x86”,而第二个将其设置为“AMD64” !此处描述了该问题:PROCESSOR_ARCHITECTURE returns AMD64 in some 32-bit processes
因此,SQLite(将其用作启发式方法)将尝试加载 64 位互操作 DLL 并失败,因为它实际上是作为 32 位进程运行的。
一种解决方法可能是检查 Environment.Is64BitProcess,当它为 false 时,手动将环境变量更改为“x86”。
关于c# - .NET 4.5 "Any CPU"带有 Perefer 32 位选项 : not work for dlls which have 32 and 64 bit versions with XCopy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17868039/