Delphi Prism 中的操作系统指令

Posted

技术标签:

【中文标题】Delphi Prism 中的操作系统指令【英文标题】:Operating System Directive in Delphi Prism 【发布时间】:2011-08-23 13:01:37 【问题描述】:

由于我正在编写一个最终将在从相同项目文件编译的 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 支持的不同方法,您如何检查您的程序在哪个平台上运行。

【问题讨论】:

【参考方案1】:

编译器指令在编译时进行评估(因此编译器指令)。因此,生成的 .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 entry 确定平台)。

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

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';

【讨论】:

以上是关于Delphi Prism 中的操作系统指令的主要内容,如果未能解决你的问题,请参考以下文章

Delphi -> Delphi prism,如何使用记录数组?

如何在 Delphi Prism 中调用函数 CreateProcess?

prism怎么做显著性分析

[Delphi]编译条件

.NET Core 3 WPF MVVM框架 Prism系列之导航系统

用于反向评估参数的 Delphi 编译器指令