当我尝试使用一个嵌入式数据库时,它有32位和64位的版本,比如SQLite和SQL Server CE在"C# - ANY CPU“中。
[两者都为32位和64位版本提供了XCOPY部署。
查看以下链接:-sql服务器ce专用安装- 使用sqlite进行-XCOPY部署- ]
我注意到,当我们检查“首选32位”时,XCOPY部署不工作,在这种情况下,procoess不是64位,而是尝试从x64文件夹和崩溃加载ddl。
如果我们取消选中“偏好32位”,它作为64位工作,并找到正确的dll。
即使我的项目是 x86 ,它也能在x86下找到正确的ddl。
为什么“偏好32位”编译选项有这种行为?是虫子吗?
发布于 2013-08-01 12:53:19
我可以证实小希比亚的问题-也让我头疼。SQLite由一个托管库组成,该库选择在运行时加载哪个本机DLL ( SQLite.Interop.DLL来自x64或x86目录)。这样,它就不需要嵌入本机库(因此更便于移植--相同的“x拷贝部署”可以在不同的体系结构上工作)。这也是SQLite通常从NuGet安装的方式。
"x86“和”任意CPU w/首选32位“(除了能够在ARM上运行)之间的区别是,第一个将环境变量PROCESSOR_ARCHITECTURE设置为"x86”,而第二个将其设置为"AMD64"!这个问题在这里描述:体系结构在一些32位进程中返回AMD64。
因此,SQLite (使用它作为启发)将尝试加载64位互操作DLL,并不幸地失败,因为它实际上是作为32位进程运行的。
解决方法可能是检查Environment.Is64BitProcess,如果这是假的,手动将环境变量更改为"x86“。
发布于 2013-07-25 20:50:25
“首选32位”的主要目的是在“CPU任意”设置下更好地支持处理器。
来自AnyCPU的真正含义是.NET 4.5和11
因此,“任意CPU 32位首选”和“x86”之间的区别只是:编译为x86的.NET应用程序将无法在ARM Windows系统上运行,但“任意CPU 32位首选”应用程序将成功运行。
在x64处理器上,设置这个选项与使用x86编译选项本质上是一样的。
发布于 2013-08-01 13:01:53
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代码似乎都能起作用之前。
https://stackoverflow.com/questions/17868039
复制相似问题