c# - .NET 4.5 "Any CPU"带有 Perefer 32 位选项 : not work for dlls which have 32 and 64 bit versions with XCopy

标签 c# .net visual-studio-2012 32bit-64bit xcopy

虽然我尝试使用具有 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/

相关文章:

c# - 将 MySQL 连接到 Visual Studio C#

visual-studio-2012 - SSDT 构建错误

c# - 如何设置命令的路径

c# - 无法等待任务 <MyObject>

c# - 共享 Windows 主机上的 Windows 服务

c# - 如何用C#从FTPS下载文件

c# - 从 http 调用中获得正确的响应,而不是异常

c# - WCF SQL 插入 GUID 转换错误

.net - 从网络共享运行(本地)Azure 辅助角色

c# - 在隔离存储中缓存变量,可移植类库方式