首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带Perefer 32位选项的.NET 4.5“任意CPU”:不适用于具有32位和64位XCopy版本的dll

带Perefer 32位选项的.NET 4.5“任意CPU”:不适用于具有32位和64位XCopy版本的dll
EN

Stack Overflow用户
提问于 2013-07-25 20:22:38
回答 3查看 2.4K关注 0票数 1

当我尝试使用一个嵌入式数据库时,它有32位和64位的版本,比如SQLiteSQL 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位”编译选项有这种行为?是虫子吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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“。

票数 3
EN

Stack Overflow用户

发布于 2013-07-25 20:50:25

“首选32位”的主要目的是在“CPU任意”设置下更好地支持处理器。

来自AnyCPU的真正含义是.NET 4.5和11

因此,“任意CPU 32位首选”和“x86”之间的区别只是:编译为x86的.NET应用程序将无法在ARM Windows系统上运行,但“任意CPU 32位首选”应用程序将成功运行。

在x64处理器上,设置这个选项与使用x86编译选项本质上是一样的。

票数 3
EN

Stack Overflow用户

发布于 2013-08-01 13:01:53

代码语言:javascript
运行
复制
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代码似乎都能起作用之前。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17868039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档