Директива об операционной системе в 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';