现在的位置: 首页 > 综合 > 正文

未能加载文件或程序集”file:///C:/Program Files (x86)/ArcGIS/DeveloperKit10.0/DotNet/ESRI.ArcGIS.ADF.Local.dll’

2013年12月09日 ⁄ 综合 ⁄ 共 3609字 ⁄ 字号 评论关闭

本文参考:http://blog.csdn.net/linghe301/article/details/6180845

(有所修改)

英语原文:http://resources.arcgis.com/zh-cn/content/kbase?fa=articleShow&d=37879

 

 

错误          

当构建基于地图引擎控件的应用程序在一个支持 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。

操作方法:

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

位置:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\ResGen.exe

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

2: 再次右键单击项目,然后选择 编辑<项目名>.csproj 。开始编辑项目文件的 XML。

3: 添加以下 XML 到任何地方。建议放在 </Project>标签前面。

(以上三个步骤也可以这么做:用记事本打开<项目名>.csproj 文件,然后将下面内容复制到 </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>

 

 

 

 

抱歉!评论已关闭.