Директива об операционной системе в Delphi Prism

Поскольку я пишу программу, которая в конечном итоге будет работать в среде 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. Horay!!! Я как бы ожидал, что он работает на Windows. Когда я запустил его в Linux под Mono, он высветил окно с тем же сообщением: "Это.NET FrameWork. Horay!!!" Я ожидал увидеть сообщение Linux: "Это Linux. Horay!!!" Если этот код работает правильно, то как проверить, на какой платформе работает ваша программа, если вам нужно выполнить разные методы, поддерживаемые только Linux, Mac или Windows.

1 ответ

Решение

Директивы компилятора оцениваются во время компиляции (следовательно, директивы компилятора). Таким образом, полученный.exe всегда будет указывать платформу, на которой он был скомпилирован, а не ту, на которой он запущен. Кроме того, директивы Delphi-Compiler не определены таким образом для языка Prism / Oxygene.

Способ получения ОС, на которой вы работаете, немного сложен (например, есть несколько значений, указывающих, что вы работаете в UNIX), но не слишком сложен.

Первое место, чтобы пойти System.Environment.OSVersion.Platform, Это перечисление определяет следующие значения в.NET 2.0: Win32S, Win32Windows, Win32NT, WinCE, Unix, Xbox, MacOSX, MacOS имеет свою ценность, в то время как Linux и другие системы Unixoid разделяют значение Unix.

Mono также определяет другие значения (см. Раздел часто задаваемых вопросов Mono по определению платформы).

Изменить: один из возможных способов будет:

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';
Другие вопросы по тегам