xPlatform의 Win32 API 영역 중에 Microsoft Visual C++ Runtime에 관한 정보 수집이 어느 정도 완료되었고 이것을 바탕으로 Phase #1을 이번달 말에 예정대로 런칭할 계획입니다. Visual C++ Runtime (msvcrt.dll)의 상당 수의 시그니처는 libc와 일치하는 것으로 보이며 이 중 몇 가지를 시험삼아 Linux 버전으로 옮겨서 작업 중입니다.
아래의 동영상은 Asianux 2.0 SP1 기반의 PC에서 Mono 1.2.5.1_3을 이용하여 xPlatform DLL을 이용한 간단한 파일 입/출력 서비스를 보여주고 있습니다. 점진적인 테스트를 거쳐 Linux에서도 표준 파일 입/출력 서비스 및 기본 C 런타임을 사용할 수 있도록 준비할 계획입니다.
xPlatform은 Project Blend의 첫 프로젝트로서 Windows, Linux, Unix, Mac OS X 등의 운영 체제에서 사용하는 각종 C 언어 런타임 및 API 함수들에 대한 플랫폼 호출 문맥들을 수집한 라이브러리이며 Microsoft .NET Framework, Microsoft Rotor, Mono, DotGNU Portable .NET을 지원 대상으로하는 Lesser GPL 라이센스 기반의 오픈 소스 라이브러리입니다.
Phase #1에서는 xPlatform의 다양한 가능성을 처음 저울질하는 단계가 될 것이며 다음의 기능들을 포함하고 있습니다.
32비트 버전의 Microsoft Windows용 C Runtime Library에 대한 플랫폼 호출 서비스
특정 프로그래밍 언어를 대상으로 하여 프로토타입 문맥들을 번역하여 제공하는 프로토타입 공유 서비스 (C#, Visual Basic .NET, Managed Extensions for C++ v1.x/v2.0 렌더링 엔진 포함 예정)
C#의 __arglist는 MSIL로 번역되면서 Call Instruction에 varargs라는 추가 파라미터를 지정하는 방식으로 사용됩니다. gmcs 컴파일러에서는 Microsoft .NET Stack과의 호환성을 위하여 __arglist 키워드에 대한 정확한 처리를 수행하는 것 처럼 보입니다. 그러나 런타임에서 Microsoft .NET Framework의 경우 이것을 정확히 관리하고 있지만 Mono의 경우 가변 인수를 IL에서 사용할 수 없습니다. 이것은 __arglist가 표준 사양이 아니기 때문에 그렇습니다. 다음은 Mono에서 가변 인수 메서드를 호출할 때 발생하는 예외입니다.
[CODE] [root@localhost ~]# mono test.exe
Unhandled Exception: System.InvalidProgramException: Invalid IL code in Program: Main (): IL_0007: call 0x0a000001
[root@localhost ~]
[/CODE]
그러나 가변 인수를 사용하지 않고 필요한 만큼 인수를 직접 선언하는 방법은 유효합니다. 다음과 같이 직접 필요한 인수를 지정하여 플랫폼 호출 선언을 지정하여 사용하는 경우 정상적으로 실행됩니다.
[CODE] [DllImport("libc", CharSet = CharSet.Ansi, ExactSpelling=true)] public static extern int printf(string format, int testIntenger);
[/CODE]
xPlatform은 이 부분에 대한 문제 개선을 위하여 동적 플랫폼 호출 선언 관리 클래스를 별도로 구현할 예정에 있으며 이 클래스를 통하여 Mono의 __arglist 비호환성 문제를 비롯하여 타 언어에서도 가변 인수 메서드의 사용을 가능하게 할 것입니다.
당신의 의견을 작성해 주세요.