1

由于我正在编写一个最终将在从相同项目文件编译的 Windows 和 Linux 环境上运行的程序,因此我想测试一下操作系统指令的性能如何。所以,我写了一个示例代码。代码似乎意外运行,或者只是我的想象。

这是代码:

method MainForm.ControlBtn_Click(sender: System.Object; e: System.EventArgs);
begin
  {$IFDEF linux}
    MessageBox.Show('This is Linux. Horay!!!', 'mypro',MessageBoxButtons.yesno);
  {$ENDIF}

  {$IFDEF WIN32}
    MessageBox.Show('This is Win32. Horay!!!', 'mypro',MessageBoxButtons.yesno);
  {$ENDIF}

  {$IFDEF CLR}
    MessageBox.Show('This is .NET Framework. Horay!!!', 'mypro',MessageBoxButtons.yesno);
  {$ENDIF}
end;

现在,当我在 Windows 上运行此方法时,它会弹出一个带有“这是 .NET Framework”的消息框。万岁!!!' 我有点期待它在 Windows 上运行。当我在 Mono 下的 Linux 上运行它时,它会弹出一个带有相同消息的消息框,“这是 .NET FrameWork。万岁!!!” 我期待看到 Linux 消息,即“这是 Linux。万岁!!!” 如果此代码工作正常,那么如果您确实需要执行仅受 Linux、Mac 或 Windows 支持的不同方法,您如何检查程序运行在哪个平台上。

4

1 回答 1

3

编译器指令在编译时进行评估(因此编译器指令)。因此,生成的 .exe 将始终说明它是在哪个平台上编译的,而不是它正在运行的平台。此外,对于 Prism / Oxygene 语言,没有以这种方式定义 Delphi-Compiler 指令。

检索您正在运行的操作系统的方法有点棘手(例如,有多个值表明您在 UNIX 上),但并不过分复杂。

第一个去的地方是System.Environment.OSVersion.Platform。此枚举在 .NET 2.0 中定义以下值:Win32S, Win32Windows, Win32NT, WinCE, Unix, Xbox, MacOSX. MacOS 有自己的价值,而 Linux 和其他 Unixoid 系统共享 Unix 价值。

Mono 还定义了其他值(请参阅有关确定平台的Mono FAQ 条目)。

编辑:一种可能的方法是:

var os: string := if Environment.OSVersion.Platform = System.PlatformID.Unix then
   'Linux/Unix'
else if Environment.OSVersion.Platform = System.PlatformID.MacOSX then
   'Mac OS X'
else
   'Windows';
于 2011-08-23T13:24:03.850 回答