C#で記述され、.NET 4.0で実行され、VisualStudio10.0でコンパイルされた単純な小さなコマンドラインプログラムがあります。
別のベンダーのAccess.mdbファイルからデータを引き出し、それをSql Serverデータベースに挿入して、アプリの1つがデータにアクセスできるようにします。
データプロバイダーとしてMicrosoft.Jet.OLEDB.4.0を使用して、.NETのOleDbConnection / OleDbCommand/OleDbDataReaderクラスを使用しています。
64ビットマシンで実行しようとするまで、これは問題なく機能しました。.NET用の64ビットOleDbプロバイダーがないことがわかりました。この問題については、Access、MDAC、Officeなどのさまざまなバージョンについての議論があり、何とかして一部の人々にとってうまくいくようになった、漠然とした半透明のスレッドがWeb全体に散らばっています。
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\からではありません。 OurName\OurApp。すべてにもかかわらず、実際には64ビットアプリとして実行されているかのように。
誰かがこれがどのように起こっているのか考えていますか?