ArcGIS Engine Controls fail to build using Visual Studio 2010 on a 64-bit OS

错误
当构建基于地图引擎控件的应用程序在一个支持 64 位操作系统 (OS) 针对微软。在 Visual Studio 2010 .Net 3.5 框架,可能会出现以下错误:

"Could not load file or assembly 'file:///C:/Program Files (x86)/ArcGIS/DeveloperKit10.0/DotNet/ESRI.ArcGIS.3DAnalyst.dll' or one of its dependencies. An attempt was made to load a program with an incorrect format.

Line 162, position 5. C:/temp/Projects/MyArcGISControlApp/Form1.resx"    
   

原因
当 Visual Studio 项目包含一个 32 位 (x86) 程序集引用和编译时的资源文件 (.resx) 时,就会出现此问题。在 Visual Studio 2010 .Net 3.5。Visual Studio 使用称为 'ResGen.exe' 在生成过程中的可执行文件。此可执行文件被标记为 MSIL (任何 CPU),作为 64 位 (x64) 进程运行在 64 位操作系统上。Esri 控件如是 32 位和标志,因为它会尝试加载 32 位程序集,并失败。


   
解决方法    
Microsoft 文章中提供的说明 (文章 ID: 2028833),已足以解决问题。它涉及到更改,迫使它作为 32 位应用程序运行的可执行文件的标头的 CorFlags 条。

要了解这做什么,下面这种情况,请参阅。如果开发人员创建。网络的可执行文件与集到任何的 CPU 的目标平台,这实质上是一个头文件中创建告诉加载和运行的可执行文件在相同的进程空间中运行它的公共语言运行库 (CLR) 的可执行文件。当在 32 位计算机上运行可执行文件,就会为 32 位应用程序 ;和 64 位的计算机上,它会作为 64 位应用程序。

当创建一个可执行文件的引用程序集的特定的进程的空间如开发引擎教程申请的进程空间应始终设置为 x 86 中。因为教程的程序集仅 32 位,这力量始终作为 32 位进程,无论目标机器运行的可执行文件,并允许它只是 32 位的程序集加载。

解决方法使用 CorFlags.exe 来更改 ResGen.exe 头文件,以便它作为 32 位应用程序运行,并使它正确加载 Esri 32 位程序集。

在 Microsoft 文章中详细介绍的步骤 (文章 ID: 2028833) 可以自动在自己的项目中。为此正常运行 Visual Studio 必须和应以管理员身份运行。

以下解决方法将自定义生成步骤添加到 Visual Studio 项目,暂时更改 'Resgen.exe' 头文件 CorFlags 条,以便在应用程序编译,然后更改它的时候完成。

注意   
   
以下说明将基本 Microsoft Visual Studio 文件进行更改,并可能会包含安全风险。继续需要您自担风险。

这些说明是解决方案的由 Microsoft 提供的改编。Esri 概不负责,这可能会导致您的 Visual Studio 安装的任何损害。建议您备份之前 < 安装位置 > /Microsoft SDKs/Windows/v7.0A/bin/ResGen.exe。

操作方法

如果前面没有看懂一点关系都没有,照着下面的步骤就可以了,前提,你先备份一下你的程序

1: 在 Visual Studio 2010 右键单击该项目,然后选择“Unload Project'”(卸载项目)。

2: 项目再次右键单击,然后选择Edit 。从该位置,可以编辑项目文件的 XML。

3: 添加以下 XML 任何地方在项目中。最好放置在 ' ' 的标签前面。

-----------------------------------------------------------------------------------------------


  
  <!--
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: 右键工程选择 'Reload Project'.

5:重新编译即可。

参考:http://resources.arcgis.com/content/kbase?fa=articleShow&d=37879

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值