2012-01-03 31 views
0

我公司的一些人正在争论它。给定源代码和编译器(使用相同的标志/开关进行编译),编译器是否可能创建在不同操作系统中具有不同行为的二进制文件?相同的编译器在不同的操作系统上创建不同的行为

具体来说,我们有一个C#项目,它必须在Windows XP和Windows 7中都运行,都是32位。编译器是VS 2008.有一个解决方案文件(* .sln),其中包含我们用来构建软件的所有必需文件,程序集,项目等。

是否有可能的是,如果码(同一溶液文件)在2008年VS被编译(具有相同的标志/开关,因为它是相同的溶液文件)的XP会产生一个二进制这将有行为差异比在Windows 7中编译的二进制文件?

通过行为差异我的意思是,在特定情况下...

  • 预期在XP中的XP版本将运行
  • 如预期在Win 7
  • 的胜利7版本将运行XP版本可能会导致在Win 7中出现错误(可能是崩溃或某些意外行为),反之亦然

该项目太庞大而无法提出一个小测试项目。如果以上情况属实,我想知道是什么情况(如果有的话)。

+3

什么是“bug”? – 2012-01-03 04:56:10

+0

构建有问题的二进制文件。做一个二进制比较。看看有什么不同。我希望他们会一样。确保仅构建版本版本。否则,将机器特定的信息添加到二进制文件和pdb中。 – AMissico 2012-01-03 04:58:34

+1

调用只存在于Windows 7中的本机API方法时想到了。 – sq33G 2012-01-03 04:58:49

回答

5

鉴于VS2008的相同的安装,包括Service Pack,并给予相同的框架,包括服务包,在测试机器,答案是没有。

但是,这并不意味着没有应用程序执行的任务会在不同的操作系统上表现不同。

您还必须考虑操作系统对应用程序(防火墙,DEP,UAC等)的不同响应可能会暴露应用程序中某个操作系统上不存在的缺陷。

然后是非托管代码问题,这是另一个话题。而且,当我们处理它时,来自应用程序的本地OS调用可能会导致不稳定。

但是没有一个是由于编译器在开头句中给出了约束条件。

2

简单的回答:没有。

由于情况不同,更常见的是您的应用程序失败。例如,缺少库,文件,注册表项;不插电的设备。

希望你不是在做一些奇怪的事情是这样;)

if (DateTime.Now.Year != 2012) 
    throw new Exception(); 
+0

根据编译时间,该代码为什么会产生不同的行为? 'DateTime.Now'不是编译时嵌入到代码中的常量值,它在运行时动态读取。 – 2012-01-03 05:06:33

+0

@Code Gray:改说,不是我的意思:) – Matthias 2012-01-03 05:07:31

1

简单的答案是否定的。无论机器或操作系统如何,编译器的本质都是基于相同的代码生成相同的程序集。

想象一下,如果这不是真的会发生什么?你将不得不有不同的操作系统和各种服务包或其他任何独立的生成机器。

相关问题