10

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ビットアプリとして実行されているかのように。

誰かがこれがどのように起こっているのか考えていますか?

4

1 に答える 1

6

わかりました、これはただ悪化しています。

.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>

これで、古い構成で、デバッグとリリースの両方で x86 をターゲットにしていることを GUI が教えてくれたと断言できたはずです。結果の実行可能ファイルは x86 としてダンプされ、私のマシンでは x86 として実行されました。しかし、.csproj を見ると、リリースをビルドするときに x86 を指定していないことが明らかであるため、どのバージョンの exe がどの条件でビルドされているかについて混乱していたようです。

いずれにせよ、新しい構成では、ビルドされているマシンや実行されているマシンに関係なく、exe がビルドおよび実行されます。

いずれにせよ、ご迷惑をおかけして申し訳ありません。また、問題を正しい方法で見るように耳を貸してくださったことに感謝します。

于 2012-05-21T22:12:59.213 に答える