gpt4 book ai didi

.net - 为什么编译为 x86 的 .NET EXE 会以 x64 运行?

转载 作者:行者123 更新时间:2023-12-04 04:22:32 26 4
gpt4 key购买 nike

我有一个简单的小命令行程序,用 C# 编写,在 .NET 4.0 下运行,并用 Visual Studio 10.0 编译。

它的作用是从另一个供应商的 Access.mdb 文件中提取数据,并将其插入到 Sql Server 数据库中,以便我们的一个应用程序可以访问数据。

我们使用 .NET 的 OleDbConnection/OleDbCommand/OleDbDataReader 类,使用 Microsoft.Jet.OLEDB.4.0 作为数据提供者。

这对我们来说效果很好,直到我们尝试在 64 位机器上运行。事实证明,.NET 没有 64 位的 OleDb 提供程序。网络上散布着关于这个问题的模糊不清的线索,讨论了不同版本的 Access、MDAC、Office 或其他任何东西,以某种方式使某些人工作。

我们所做的是将项目配置为面向 x86。问题就解决了。

现在它回来了,原因我根本不明白。当我在本地机器上构建程序时,它以 x86 运行,但是当我在我们的构建机器上构建它时,它以 x64 运行。

项目文件明确配置为面向 x86:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>

它是从同一个批处理文件构建的,无论是在我的机器上还是在构建机器上:
msbuild OurApp.sln /property:Configuration=Release

生成的 exe 说它们是 x86,不管它们是在哪台机器上构建的。如果我在任一上运行 dumpbin/headers ,我会看到:
FILE HEADER VALUES
14C machine (x86)
3 number of sections
4FBA64C8 time date stamp Mon May 21 10:52:40 2012
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
102 characteristics
Executable
32 bit word machine

在我的机器上构建的 exe 转储与构建机器上构建的 exe 之间的唯一区别是时间戳和 .pdb 文件的路径。

但是,奇怪的是,在我的机器上构建的一个 exe 运行得很好,一个在构建机器上构建的 exe 错误,与我们在将它构建为 x64 时看到的错误消息相同。

更重要的是 - 我们的程序从注册表中获取其配置,为了方便用户,如果没有找到设置,它会创建一个。我们从 HLM\SOFTWARE\OurName\OurApp 中读取和创建它们。但是,当然,由于这是在 64 位机器上运行的 32 位应用程序,它确实应该从 HLM\SOFTWARE\WoW6432Node\OurName\OurApp 读取和写入。

使用我的机器上构建的应用程序,它确实如此。但是在构建机器上构建的应用程序,尽管是为 x86 编译的,并且具有表明它们应该作为 x86 运行的头文件,但从 HLM\SOFTWARE\OurName\OurApp 而不是从 HLM\SOFTWARE\WoW6432Node\读取和写入我们的名字\我们的应用程序。好像它实际上是作为 64 位应用程序运行的,尽管如此。

有谁知道这是怎么发生的?

最佳答案

好吧,这只是加重了。

我们在 .csproj 文件中拥有的是:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>

这是采用默认配置并将其更改为目标 x86 的结果。

我删除了 AnyCPU 配置,并创建了新的 x86 配置,并得到:
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
</PropertyGroup>

现在我可以发誓,GUI 告诉我我在调试和发布中都针对 x86,在旧配置中。并且生成的可执行文件转储为 x86,并在我的机器上以 x86 运行。但显然我对在什么条件下构建的 exe 版本感到困惑,因为查看 .csproj,很明显我们在构建发布时没有指定 x86。

在任何情况下,使用新配置,exe 都会构建和运行,无论它们是在什么机器上构建的,或者它们在哪台机器上运行。

无论如何,很抱歉打扰您,并感谢您提供帮助我以正确方式看待问题的耳朵。

关于.net - 为什么编译为 x86 的 .NET EXE 会以 x64 运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10691472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com