실행 가능한 어셈블리 (EXE)를 라이브러리처럼 사용하기 위한 조건

닷넷 프레임워크는 MSIL 기반의 어셈블리 코드를 생성하며, 기본적으로 이 어셈블리 코드는 실행 주체에 관계없이 다양한 방법으로 불러들여지고 실행될 수 있습니다. 대개의 경우, 라이브러리 코드를 DLL로 컴파일하여 GAC에 등록하거나 같은 설치 미디어에 배포하는 방법을 주로 택합니다. 하지만, EXE 파일은 라이브러리와는 다르게 단독 실행을 기준으로 프로그래밍하는 일이 많기 때문에 기술적으로는 참조가 가능하나 실제로 EXE 파일을 재 사용하여 프로그래밍하는 것은 예외 상황을 쉽게 일으킵니다.


DLL에 있는 코드를 재 사용하는 것과 달리 EXE에 있는 코드를 재 사용하는 것은 여러모로 가치있습니다. 특히, EXE에 있는 코드를 재사용하기 위하여 Public 형식으로 Windows Forms 및 Windows Forms Control을 노출해두는 경우 다양한 방법으로 외부에서 제어할 수 있기 때문에, 완성된 .NET 기반 일반 응용프로그램을 또 다른 프로그램의 일부 구성 요소처럼 다루는 것이 가능합니다.


이를 위해서 몇 가지 고려해야 할 사항이 있습니다.


첫 번째는, System.Windows.Forms.Application 클래스와 System.Environment 클래스의 메서드를 사용하는 코드를 보완해야 합니다. 이들 클래스는 현재 실행 중인 어셈블리의 환경을 다루기 때문에, EXE를 참조하는 또 다른 EXE 프로그램에 투영됩니다. 이 경우, 상호 간섭이 발생하므로 의도하지 않은 결과가 연출될 수 있습니다. 재 사용하고자 하는 EXE 상의 코드에서 위의 클래스를 이용하는 경우 다음과 같은 정적 프로퍼티를 두고 이 프로퍼티의 값이 True일 경우에만 해당 메서드와 프로퍼티를 제어하도록 수정해야 합니다.


using System.Reflection;
// …
return Assembly.GetExecutingAssembly().Equals(typeof(/* 재 사용할 어셈블리 내의 형식명 */).Assembly);

위의 판정 방법을 통하여 선택적으로 호출해야 하는 멤버들은 다음과 같습니다.


System.Windows.Forms.Application 클래스: 전체 멤버
System.Environment 클래스: Exit 메서드, ExitCode 프로퍼티, FailFast 메서드


STAThreadAttribute나 MTAThreadAttribute가 적용된 Main 메서드는 CLR에 의하여 실행될 때에만 의미가 있습니다. 만약, 로드할 대상 EXE가 MTA 스레드 모드로 시작된 EXE에 의하여 실행되어야 하는 경우 별도로 스레드를 분리하는 등의 방법을 통하여 간접 실행해야 합니다. (특히 Windows Forms나 GUI 관련 응용프로그램들)

댓글 남기기