FAQ
エラー:64 ビット OS 上の Visual Studio 2010 で、ArcGIS Engine コントロールのビルドに失敗する

ナレッジ番号:5250 | 登録日:2023/07/26 | 更新日:2023/12/28

【エラー メッセージ】
64 ビット オペレーティング システム(OS)上の、Visual Studio 2010 の Microsoft .NET 3.5 Framework をターゲットとしたArcGIS Engine コントロール ベースのアプリケーションにおいて、次のエラーが生じることがあります。

"ファイルまたはアセンブリ 'file:///C:/Program Files (x86)/ArcGIS/DeveloperKit10.0/DotNet/ESRI.ArcGIS.3DAnalyst.dll'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。 行 1991、位置 5 です。     C:\temp\Projects\EngineWindowsApplication1\Form1.resx"

プロジェクトのセットアップ方法、参照アセンブリ、使用しているコンピュータ上で ArcObjects .NET SDK がインストールされている場所などによって、上記とは異なるエラーメッセージが生じることがあります。

マイクロソフトは、この問題を認識し、解決方法として次の Knowledge Base Article を提供しています。 Article ID: 2028833: "MSBuild 4.0 or Visual Studio 2010 may fail to compile a 32-bit application targeted for .Net Framework 3.5, 3.0 or 2.0 on x64 machine."

【原因】
この問題は、Visual Studio プロジェクトが 32 ビット(x86)アセンブリを参照するリソース ファイル(.resx)を含み、Visual Studio 2010 の .NET 3.5 でコンパイルしたときに発生します。Visual Studio は、ビルド処理中に 'ResGen.exe' と呼ばれる実行ファイルを使用します。この実行ファイルは、MSIL(Any CPU)として扱われ、64 ビット OS 上では、64 ビット(x64)プロセスとして実行します。Esri コントロールは 32 ビットのため、そのように認識され、32 ビット アセンブリをロードしようとして失敗します。

【解決策 / 回避策】
マイクロソフトの Knowledge Base Article (Article ID: 2028833)で提供されている手順は、この問題を解決するのに十分なものです。実行ファイルのヘッダの CorFalgs セクションを書き換えて、強制的に 32 ビット アプリケーションとして実行します。

この操作が行っている内容について理解するために、次のシナリオについて言及します。仮に、開発者が .NET 実行ファイルを作成し、プラットフォーム ターゲットを 'Any CPU' に設定した場合、これは、基本的には、実行ファイル内にヘッダ ファイルを作成し、実行ファイルが動作しているのと同じプロセス空間に実行ファイルをロードし、実行するよう、共通言語ランタイム(CLR:Common Language Runtime)に命じます。32 ビット マシンで実行ファイルを実行しているときは 32 ビット アプリケーションとして、64 ビット マシンでは 64 ビット アプリケーションとして実行します。

ArcGIS Engine ArcObjects アプリケーションといった特定のプロセス空間のアセンブリを参照する実行ファイルを作成する際は、プロセス空間は常に x86 に設定されている必要があります。なぜなら、ArcObjects のアセンブリは 32 ビットのみのため、ターゲット マシンにかかわらず、実行ファイルは常に 32 ビット プロセスとして実行することを強制し、32 ビットのアセンブリしかロードしないためです。

回避策としては、CorFlags.exe を使用して ResGen.exe のヘッダ ファイルを変更し、実行ファイルを 32 ビット アプリケーションとして実行し、Esri 32 ビット アセンブリを正しくロードさせることです。

マイクロソフトの Knowledge Base Article(Article ID: 2028833)に詳述のステップで、プロジェクト内部で自動化することができます。これを正しく動作させるため、Visual Studio は管理者権限のあるユーザで実行しなければなりません。 

次の解決方法では、'Resgen.exe' ヘッダ ファイルの CorFlags セクションを一時的に変更する Visual Studio プロジェクトに、カスタム ビルド手順を追加し、アプリケーションのコンパイルが終了後、変更を元に戻します。

次の手順は、 Microsoft Visual Studio の基本ファイルを変更するもので、セキュリティ リスクを伴う場合があります。十分ご注意の上、自己責任で行って下さい。

これらの手順は、マイクロソフトによって提供されている解決方法です。Esri は、 この操作に起因する Visual Studio インストールに与えるいかなる損害も保障しません。処理を行う前に、<インストール場所>\Microsoft SDKs\Windows\v7.0A\bin\ResGen.exe のバックアップを取っておくことをお勧めします。

  1. Visual Studio 2010 で、プロジェクトを右クリックし、'プロジェクトのアンロード' を選択します。 
  2. プロジェクトを再度右クリックし、'編集 <プロジェクト名>' を選択します。ここから、プロジェクト ファイルの XML が編集可能となります。
  3. 下記の XML をプロジェクトの任意の場所に追加します。最終行の  '</Project>' タグのすぐ上など、分かりやすい場所が望まれます。
<!--
      Workaround for VS2010 .NET 3.5 application referencing x86 assembly in resx file on 64-bit OS
      http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/e5900710-9849-4d10-aa28-48b734d06bf2
-->
<PropertyGroup>
  <ForceResGen32Bit Condition="'$(MSBuildToolsVersion)'=='4.0' And '$(PROCESSOR_ARCHITEW6432)'!='' And '$(TargetingClr2Framework)'=='true' And '$(PlatformTarget)'=='x86'">true</ForceResGen32Bit>
</PropertyGroup>
<Target Name="BeforeResGen" Condition="'$(ForceResGen32Bit)' == 'true'">
  <PropertyGroup>
    <ResGenSdkToolsPath>$(IntermediateOutputPath)ResGenForced32Bit\</ResGenSdkToolsPath>
  </PropertyGroup>
  <!-- Copy resgen.exe to intermediate working directory for UAC settings -->
  <Copy SourceFiles="$(TargetFrameworkSDKToolsDirectory)ResGen.exe"
        DestinationFiles="$(ResGenSdkToolsPath)ResGen.exe" />
  <!-- corflags.exe resgen.exe /32BIT+ /Force-->
  <Exec WorkingDirectory="$(ResGenSdkToolsPath)"
        Command="&quot;$(TargetFrameworkSDKToolsDirectory)corflags.exe&quot; ResGen.exe /32BIT+ /Force" />
  <!-- GenerateResource Task parameters
        Using the non-64bit Tracker.exe and indicate resgen.exe has been forced to x86 -->
  <PropertyGroup>
    <ResGenTrackerSdkPath>$(SDK40ToolsPath)</ResGenTrackerSdkPath>
    <ResGenToolArchitecture>Managed32Bit</ResGenToolArchitecture>
    <CacheTargetFrameworkSDKToolsDirectory>$(TargetFrameworkSDKToolsDirectory)</CacheTargetFrameworkSDKToolsDirectory>
    <TargetFrameworkSDKToolsDirectory>$(ResGenSdkToolsPath)</TargetFrameworkSDKToolsDirectory>
  </PropertyGroup>
</Target>
<Target Name="AfterResGen" Condition="'$(ForceResGen32Bit)' == 'true'">
  <PropertyGroup>
    <TargetFrameworkSDKToolsDirectory>$(CacheTargetFrameworkSDKToolsDirectory)</TargetFrameworkSDKToolsDirectory>
  </PropertyGroup>
  <RemoveDir Directories="$(ResGenSdkToolsPath)" Condition="Exists('$(ResGenSdkToolsPath)')" />
</Target>

 4.  プロジェクトを右クリックし、'プロジェクトを再読み込み' を選択します。

  5.  プロジェクトをビルドします。

関連情報: 

プラットフォーム: Windows Server 2003, Windows Server 2008, Windows 7
ESRI Art. Number: 37879

メタデータ

種類

製品