1

동일한 프로젝트 파일에서 컴파일 된 Windows 및 Linux 환경에서 실행되는 프로그램을 작성하고 있으므로 운영 체제 지시문이 얼마나 적합한 지 테스트하고 확인하고 싶습니다. 그래서, 나는 샘플 코드를 썼다. 코드가 예기치 않게 실행되는 것처럼 보일뿐입니다. 내가 Windows에서이 방법을 실행하면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; 

지금, 그것은이 .NET 프레임 워크입니다 '에 메시지 상자를 팝업 : 여기

는 코드입니다. 호레이! ' 나는 그것이 Windows에서 돌아가고 있다고 예상했다. Mono에서 Linux로 실행했을 때, "이것은 .NET FrameWork, Horay !!!"같은 메시지가 담긴 메시지 상자를 나타 냈습니다. 나는 리눅스 메시지를 기대하고 있었다. "This is Linux, Horay !!!" 이 코드가 올바르게 작동하면 Linux 또는 Mac 또는 Windows에서만 지원되는 다른 메소드를 실행해야하는 경우 프로그램이 실행중인 플랫폼을 확인하는 방법을 확인하십시오.

답변

3

컴파일러 지시어는 컴파일 타임에 평가됩니다 (따라서 컴파일러 지시문). 결과로 생성되는 .exe는 항상 실행되고있는 플랫폼이 아니라 컴파일 된 플랫폼을 나타냅니다. 또한 Delphi-Compiler 지시문은 Prism/Oxygene 언어에 대해이 방식으로 정의되지 않습니다.

실행중인 OS를 검색하는 방법은 조금 까다 롭습니다 (예를 들어 UNIX에 있음을 나타내는 여러 값이 있습니다). 지나치게 복잡하지는 않습니다.

첫 번째 장소는 System.Environment.OSVersion.Platform입니다. 이 열거 형은 .NET 2.0에서 다음 값을 정의합니다. Win32S, Win32Windows, Win32NT, WinCE, Unix, Xbox, MacOSX. MacOS는 자체 가치가 있으며 Linux와 다른 Unixoid 시스템은 Unix 값을 공유합니다.

모노는 다른 값도 정의합니다 (플랫폼 결정에 대해서는 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