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 でこのメソッドを実行すると、「This is .NET Framework. ホライ!!!」Windowsで実行されていることを期待していました。Linux 上で Mono を実行すると、同じメッセージが表示されたメッセージ ボックスがポップアップ表示されました。「This is Linux. Horay!!!」という Linux メッセージが表示されることを期待していました。このコードが正しく機能している場合、Linux、Mac、または Windows でのみサポートされているさまざまなメソッドを実行する必要がある場合に、プログラムが実行されているプラ​​ットフォームを確認するにはどうすればよいでしょうか。

4

1 に答える 1

3

コンパイラ ディレクティブはコンパイル時に評価されます (したがって、コンパイラ ディレクティブ)。したがって、結果の .exe は、実行されているプラ​​ットフォームではなく、コンパイルされたプラットフォームを常に示します。また、Delphi コンパイラ ディレクティブは、Prism/Oxygene 言語ではこのように定義されていません。

実行している OS を取得する方法は少し複雑ですが (たとえば、UNIX を使用していることを示す複数の値があります)、それほど複雑ではありません。

最初に行く場所は ですSystem.Environment.OSVersion.Platform。この列挙型は、.NET 2.0 で次の値を定義しますWin32S, Win32Windows, Win32NT, WinCE, Unix, Xbox, MacOSX。MacOS には独自の価値がありますが、Linux やその他の Unixoid システムには Unix の価値があります。

Mono は他の値も定義します (プラットフォームの決定については、 Mono FAQ のエントリを参照してください)。

編集:1つの可能な方法は次のとおりです。

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 に答える