两台机器上的相同源代码会产生不同的可执行行为

时间:2008-09-17 19:55:26

标签: .net datetime compiler-construction

以下是该方案:

存储在SVN中的C#Windows应用程序项目用于创建可执行文件。通常,构建服务器处理构建过程并定期创建构建,这些构建由测试使用。在这个特定的实例中,我被要求修改特定的构建并创建可执行文件。

我不完全确定构建服务器是否修改了项目文件,但我知道它在SVN中创建了用于编译可执行文件的源代码的标记。使用该标签我已经在第二台机器上检查了代码,这是一台开发机器。然后我在开发机器上编译了源代码。

执行时,在开发计算机上编译的应用程序的功能与构建服务器编译的应用程序完全不同。例如,在测试机器上,应用程序检测到DateTime Parse execption。但是,构建机器的可执行文件不会引发任何异常。如果我在开发机器上运行可执行文件,则不会抛出任何异常。

总而言之,两台机器在理论上使用相同的源代码和项目 开发机器的可执行文件仅适用于开发机器。 Build机器的可执行程序可以在每台机器上运行,包括开发机器。

机器的区域设置或时区是否存储在已编译的可执行文件中?知道什么可能导致这种行为或如何检查可执行文件以找出可能的差异并纠正它们?

不幸的是,我无法使用测试机并将调试器连接到它。我会尽快。

9 个答案:

答案 0 :(得分:4)

该应用程序使用其运行的计算机的区域设置,看起来这是您的问题。您可以通过将System.Threading.Thread.CurrentThread.CurrentCulture和System.Threading.Thread.CurrentThread.CurrentUICulture设置为特定值来强制线程使用特定区域性。

答案 1 :(得分:2)

这两台机器可能有不同版本的底层dll,而这些版本不属于您的构建过程。我在内部服务器场分发服务时发现了这种情况。

答案 2 :(得分:1)

您可以在调试器下运行构建机器上的程序吗?

如果是,请调试问题 - 无需猜测

让dev机器上的调试器捕获异常,在构建机器的同一位置设置一个断点。看看两者之间有什么不同。

答案 3 :(得分:1)

我在XP上看到不同的“区域和语言选项”导致了这种行为。两台机器上都匹配吗?开始|设置|控制面板|区域和语言选择......

答案 4 :(得分:1)

我有几个问题 - 这两台机器的区域设置是否相同,错误日志在哪里?我希望;-)你有异常处理和写入磁盘,事件日志......有助于解决这类问题。

日期来自哪里被解析?如果它在你的数据库中,也许你的数据也不好。

答案 5 :(得分:0)

我曾经遇到过类似的问题(C ++除外)当我比较编译后的可执行文件的大小时,它们就开始了。不幸的是,经过几天的搜索,我找到的最佳解决方案是卸载VS05并重新安装它。

答案 6 :(得分:0)

为什么你要使用构建服务器,对于C#代码,如果我可能会问?

我使用它时C#的构建时间几乎不可察觉(< 2s)。应用真的那么大吗?

答案 7 :(得分:0)

构建系统可能会发布一个版本,而在开发PC上构建手动版本则会产生调试版本。调试版本中有更多错误检查。看看您是否可以手动构建发布版本并查看是否存在差异。

答案 8 :(得分:0)

如果每个人在不同的计算机上构建相同的程序,则很少使用相同的源代码。你应该总是假设程序是不同的,从不期望它们是相同的。在具有良好的包管理器和定期和/或随机更新的Linux环境中,永远不要指望相同的源代码在同一台计算机上构建相同的程序。语言越高,越糟糕。为调试器构建程序与构建发布版本截然不同。即使没有调试器,调试器版本也会隐藏您在发布版本之前不会发现的错误。如果你过分依赖调试器环境,你基本上可以调试程序两次。

相关问题