1

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

下面是代码:

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框架。 Horay!”我有点期待它是在Windows上运行的。当我在Mono下的Linux上运行它时,它弹出一个消息框,其中包含相同的消息:“这是.NET FrameWork。Horay !!!”我期待看到Linux消息,这是“这是Linux,Horay !!!”如果此代码运行正常,那么如果您需要执行仅受Linux或Mac或Windows支持的不同方法,您如何检查运行哪个平台的程序。

回答

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

@塞巴斯蒂安,伟大的工程谢谢。 – ThN