none
.net 4.0.3 在不同环境的编译差异问题

    问题

  • 在我开发的项目中,为了保持与windows xp系统的兼容性,需要使用.net 4.0.3,因为据我了解这是xp系统支持的最高.net framework版本。

    在早些时候,在win7下使用vs2010编译.net 4.0.3程序可以在xp上正常运行,

    但是升级系统到win10后,使用vs2013或者vs2015编译相同的.net 4.0.3程序却出现问题,程序可以在win10运行但却不能在xp系统运行!提示为“不是有效的32位应用程序”

    调试用的xp系统已经配置了.net 4.0.3平台,而且其本地的vs2010可以编译出成功运行的程序。

    根据查阅相关信息,我了解到.net 4.x是“就地更新”,所以在VS2013或VS2015中设置目标为.net 4.0.3时,实际使用的是.net4.5或其他高版本的库,而这些高版本库是xp所不支持的,因此产生错误。

    问题:有没有方法可以在VS2013/2015中编译.net 4.0.3平台的程序,使其在xp运行时能够正确选择支持的运行时版本?

    2016-2-17

    经过一段时间的观察,这种编译问题只出现在具有入口点的程序(.exe)上,dll即便在VS2012以后的版本中编译,仍然可以在xp系统引用运行,因此可以判断该问题应该是与程序入口有关。

    我猜想在VS2010中编译生成时,会添加兼容xp的入口标记,而在其后的VS版本中,由于不再提供对xp的支持,取消了兼容标记。


    heroius j


    • 已编辑 Heroius 2016年2月17日 13:04 更多的问题观察信息补充
    2016年1月9日 2:30

答案

  • 能否编译成.Net4.0.3取决于有没有SDK(Software Development Kit 软件开发工具包),换句话说就是必须要有编译用的库,没有这个怎么编译?这里(http://getdotnet.azurewebsites.net/target-dotnet-platforms.html#)显示了所有的.Net SDK,很明显只有VS2010才有.Net4.0.3 SDK,VS2012、2013、2015中只有.Net4.5。所以请使用VS2010来开发。
    在win10上同时装VS2010和2015,相同的代码和配置项目生成,果然VS2010的生成可以在xp上运行,而2015的不行

    heroius j

    • 已标记为答案 Heroius 2016年1月19日 7:08
    2016年1月19日 7:08

全部回复

  • 你好,Heroius

    你可以在VS2013/VS2015中创建项目时选择“.Net Framework 4”下的程序类型,而不要选择默认的4.0以上版本的。

    另外,你可以可以参考如下类型错误问题的帖子。

    http://www.codeproject.com/Questions/610049/exeplusisplusnotplusaplusvalidpluswinplus-plusapp

    Best Regards,

    Albert Zhang

    2016年1月10日 5:14
  • 如图是VS2015项目目标框架列表,注意.net framework 4.0.3在安装相应multitarget之后是可以选择的


    heroius j

    2016年1月10日 16:38
  • 你好,Heroius

    你可以在VS2013/VS2015中创建项目时选择“.Net Framework 4”下的程序类型,而不要选择默认的4.0以上版本的。

    另外,你可以可以参考如下类型错误问题的帖子。

    http://www.codeproject.com/Questions/610049/exeplusisplusnotplusaplusvalidpluswinplus-plusapp

    Best Regards,

    Albert Zhang


    谢谢你的解答,

    我知道当目标设置为.net 4的时候不会发生错误,但是我需要.net 4.0.3,会用到其中的新特性,比如引用的portable库中会使用xml linq

    奇怪的是在xp系统里用vs2010编译相同的项目,生成的程序是可以执行的


    heroius j

    2016年1月10日 16:40
  • 编译器能不能编译取决于有没有用于编译的代码库,而不是你的选择。

    你是说虽然在VS2015里可以设置4.0.3的目标,并且编译出来的程序CLR头也显示运行时版本为4.0.3,但实际上并非如此?

    这算是bug了吧

    还有,只要是VS2010就可以,与系统和已安装运行时版本无关吗?明天试试在win10上装下


    heroius j

    2016年1月11日 13:59
  • 能否编译成.Net4.0.3取决于有没有SDK(Software Development Kit 软件开发工具包),换句话说就是必须要有编译用的库,没有这个怎么编译?这里(http://getdotnet.azurewebsites.net/target-dotnet-platforms.html#)显示了所有的.Net SDK,很明显只有VS2010才有.Net4.0.3 SDK,VS2012、2013、2015中只有.Net4.5。所以请使用VS2010来开发。
    在win10上同时装VS2010和2015,相同的代码和配置项目生成,果然VS2010的生成可以在xp上运行,而2015的不行

    heroius j

    • 已标记为答案 Heroius 2016年1月19日 7:08
    2016年1月19日 7:08