NET 4.5”;任何CPU”;带有Perefer 32位选项:不适用于带有XCopy的32位和64位版本的dll
本文关键字:32位 XCopy 64位 dll 版本 适用于 选项 任何 CPU 带有 NET | 更新日期: 2023-09-27 18:25:02
当我尝试使用一个嵌入式数据库时,它同时具有32位和64位版本,如"C#-ANY CPU"中的SQLite和SQL Server CE
[两者都为其32位和64位版本提供XCOPY部署。
检查以下链接:-sql server ce私有安装-使用sqlite的XCOPY部署-]
我注意到,当我们检查"首选32位"时,XCOPY部署不起作用,在这种情况下,procoess不是64位,但试图从x64文件夹加载ddl并崩溃。
如果我们取消选中"首选32位",它可以作为64位使用,并且还可以找到正确的dll。
即使我的项目x86,它也能在x86下找到合适的ddl。
为什么"首选32位"编译选项会有这种行为?是虫子吗?
我可以确认小嬉皮士的问题——也让我头疼。SQLite由一个托管库组成,该库选择在运行时加载哪个本机DLL(x64或x86目录中的SQLite.Interop.DLL)。这样,它就不需要嵌入本机库(因此更具可移植性——相同的"xcopy部署"可以在不同的体系结构上工作)。这也是通常从NuGet安装SQLite的方式。
"x86"answers"Any CPU w/prefer 32-bit"(除了能够在ARM上运行之外)的区别在于,第一个将环境变量PROCESSOR_ARCHITECTURE设置为"x86",而第二个将其设置为"AMD64"!问题描述如下:PROCESSOR_ARCHITECTURE在一些32位进程中返回AMD64
因此,SQLite(将其用作启发式)将尝试加载64位互操作DLL,但由于它实际上是作为32位进程运行的,因此会失败。
解决方法可能是检查Environment.Is64BitProcess,如果为false,则手动将环境变量更改为"x86"。
"首选32位"的主要目的是通过"CPU Any"设置更好地支持处理器。
从AnyCPU对.NET 4.5和Visual Studio 11 的真正意义
那么,"Any CPU 32-bit preferred"answers"x86"之间的区别仅在于:编译为x86的.NET应用程序将无法在ARM Windows系统上运行,但"Any CPU32-bit prefer"应用程序将成功运行。
在x64处理器设置上,此选项与使用x86编译选项基本相同。
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代码似乎使事情正常工作之前。