我公司的一些人正在争论它。给定源代码和编译器(使用相同的标志/开关编译),编译器是否可能创建在不同操作系统中具有不同行为的二进制文件?
具体来说,我们有一个必须在Windows XP和Windows 7中运行的C#项目,都是32位。编译器是VS 2008.有一个解决方案文件(* .sln),它包含我们用来构建软件的所有必要文件,程序集,项目等。
如果在VS 2008中编译代码(相同的解决方案文件)(使用相同的标记/开关,因为它是相同的解决方案文件),是否有可能产生一个具有行为差异的二进制文件比Windows 7中的已编译二进制文件?
行为差异我的意思是,在特定情况下......
该项目太庞大,无法提出一个小测试项目。我想知道上述情况是什么情况(如果有的话)。
答案 0 :(得分:5)
考虑到VS2008的相同安装,包括服务包,以及在测试机器上给出相同的框架(包括服务包),答案是否定的。
但是,这并不意味着应用程序执行的任务不会在不同的操作系统上表现不同。
您还必须考虑操作系统对应用程序的不同响应(防火墙,DEP,UAC等)可能会在一个操作系统上暴露应用程序中存在的错误。
然后是非托管代码问题,这是另一个主题。而且,当我们处于此状态时,来自您的应用程序的本机操作系统调用可能会导致不稳定。
但这一切都不是由于编译器给出了开头句子中的约束。
答案 1 :(得分:2)
简单回答:不。
您的应用程序因不同情况而失败更为常见。例如,缺少库,文件,注册表项;未插电的设备。
希望你没有做这样奇怪的事情;)
if (DateTime.Now.Year != 2012)
throw new Exception();
答案 2 :(得分:1)
简单的答案是否定的。无论机器或操作系统如何,编译器的性质都是基于相同的代码生成相同的程序集。
想象一下如果这不是真的会发生什么?您必须拥有具有各种操作系统和各种服务包或其他任何内容的单独构建计算机。