none
x86环境开发的代码在x64环境编译时 resx文件报错 RRS feed

  • 问题

  • 我以前是在 win7 32位环境开发代码,最近重装系统环境变为64位,用vs2012 编译代码时老提示报错,报错页面都是resx文件,在网上查找方法是把  mimetype="application/x-microsoft.net.object.bytearray.base64" 中 base64改为 base32, 程序可正常编译,但运行时用到这个控件会报错,求大神帮忙解答一下,有没有方法解决一下。

    2014年4月8日 10:02

答案

  • 操作前先备份一下。问题其实是64位和32位MSIL标识的问题。具体原因你应该已经找到了。下面是方法

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

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

     添加以下 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>

    2014年4月8日 10:32

全部回复

  • 操作前先备份一下。问题其实是64位和32位MSIL标识的问题。具体原因你应该已经找到了。下面是方法

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

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

     添加以下 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>

    2014年4月8日 10:32
  • 添加上面xml后 ,  resx  文件中 mimetype="application/x-microsoft.net.object.bytearray.base64"   base64还需要改为 base32 吗?

    我程序有好几个类库,我改了一个有问题的类库,但运行时使用到的这个类库中的控件加载仍然会报错,是不是每个类库项目和运行项目都需要加

    2014年4月10日 4:30
  • 你可以尝试一下全部修改,看看是否可行。但是不是可以换个思维,比如考虑稍微修改一下框架或者控件,来使这个程序X86或者X64环境下都是可以顺利运行等。希望采纳,谢谢。
    2014年4月10日 5:27