Right now do !

[.NET]일반 기 컴파일된 닷넷 프로그램의 플렛폼(CPU)변경

by 지금당장해

 VC++로 개발을 주로 하던 시절에는 X86, X64 컴파일을 구별해서 해줘야 하고 설치 또한 어떤 플렛폼에 설치 하는냐에 따라 신경을 써줘야 했다. 근데 닷넷이 나왔는데 Any CPU란다. 응답하라 1988 대사로 표현 하자면 "왠열" 근데 이상하다. Any CPU가 도대체 뭐냐 새로운 플렛폼이 나온것도 아닌데.... 닷넷의 원리를 생각 해보면 답이 나온다.


 닷넷은 컴파일을 하고 나면 실행 파일이 탄생하는 것이 아니다.  .NET Framework라고 하는 가상의 플렛폼 위에서 동작 할 것을 고려 하여 개발자의 컴파일 시점에는 즉시 실행이 가능한 언어(IL)가 생성 된다. (JAVA의 개념과 유사하다.) 그리고 실제 사용자가 실행을 할때 즉시 컴파일이 된다. 이를 JIT(Just in-time)컴파일러라고 한다. 자 여기 까지 이해하고 Any를 떠올리자 ..... 윤종신에 Any라는 노래가 생각 난다. --;;


 어느 플렛폼이던 최적으로 동작한다. 이것이 Any의 정의라고 할 수 있다. 즉 해당 컴퓨터와 OS가 32bit 이면 Any는 동작 할 때 32bit 즉 x86으로 컴파일이 되어 동작하고 64bit이면 x86으로 동작하게 되어 있다. 자 여기 까지 생각 하면 아름답다.  알아서 한다는데 뭐시 문제냐.... 

애석 하게도 알아서 할 수 있는 벤더에서 메커닉을 제공하였으나 현실의 세상에서는 알아서 할 수 없는 상황이 존재 한다. 이 상황중 하나가 x86종속이다. 참조하는 닷넷 어셈블리건 COM컴포넌트던 이미 x86으로 고정하여 컴파일 된 상태이며 이 모듈들이 우리가 작성하여 소스가 있는 상태가 아니라 3rd Party가 제공하는 것이라면 어쩔껴.... 이럴땐 어쩔수 없이 x86으로 컴파일 해야 한다. 


 자 되었어 그래 x86으로 컴파일 했어 그럼 되지 뭐.... 근데 우리 고객사에서 아주 오래전에 우리가 x86전용으로 개발한 COM을 쓰고 있는데 안된다고 함, 그래서 똑 같이 이야기 해줬다. x86으로 컴파일 하시오. 못한단다. 단위 DLL 프로그램 소스는 가지고 있는데 이를 호출 하는 Host exe의 최종 판을 구할 수 없단다. 이때 컴파일 없이 exe만 가지고 플렛폼을 변경 할 수 있는 방법이 있다.


본론으로 넘어가 이와 관련된 기술지원 문서를 아래와 같이 공개 한다.




원인

귀사에서 운영하고 계시는 기간계 시스템은 .NET Winform application구조 입니다. Host Application (Exe) Any CPU로 컴파일 된 상태이며 그간 주로 X86 CPU를 사용하는 컴퓨터에서 운영을 하고 계셨는데요 최근 64Bit기반의 컴퓨터가 추가 도입되면서 해당 이슈가 발생 하였습니다. (귀사에서 사용하고 계시는 저희 제품은 32bit용으로 개발되어 단종된 상태 입니다.) 근본적으로 이를 해결할 수 있는 방법은 Exe프로그램을 X86으로 변경 컴파일 하여 배포하면 되나 해당 솔루션의 기술지원이 끊겨 이 방법을 적용 할 수 없는 상황 이였습니다.

 

해결 방안


1. 귀사에 적용된 모듈을 64bit지원이 가능한 버전으로 업그레이드 하는 방안

문제점: 기존에 쓰고 계시던 리포트 파일을 모두 마이그레이션(수작업) 하는 공수가 필요

2. 해당 모듈을 사용하는 부분만 따로 떼어 내어 32bit컴파일 한 후 업무 프로그램에서 호출을 변경 하는 방안

문제점: 시스템 구조가 복잡해지고 호출 하는 구조에 개발 공수가 투입 되야 함

3. 마이크로 소프트에서 제공하는 CorFlags.exe 유틸리티를 이용하여 이미 컴파일된 모듈의 플래그를 변경하여 32bit로 동작 할 수 있도록 조치

프로그램 코드의 컴파일 없이 가장 간단하게 Exe프로그램의 실행 조건을 Any CPU에서 X86으로 변경할 수 있음

조치사항

위 해결 방안중 3안의 방법이 가장 현실성 있다고 판단하여 이를 아래와 같이 시도하여 이슈를 해결 하였습니다.

 

  1. 귀사의 개발자 PC에서 Exe프로그램을 복사 (X86용으로 변경 하기 위한 준비)
  2. 해당 프로그램의 컨피그 파일(실행 파일명.config)을 동일한 이름으로 변경
  3. 관리자 커맨드 창 > CorFlags /32BIT+ [해당 프로그램의 Full경로] > 엔터
  4. CorFlags [해당 프로그램의 Full경로] > 엔터 > 32Bit 활성화 플래그 확인 (활성화 되면 32Bit항목이 1 값을 갖게 )
  5. 해당 프로그램 실행 > x86모듈이 적용된 업무 화면을 열어 동작 확인

 

해당 기술에 대한 마이크로소프트의 공식 자료를 링크 합니다. 링크를 확인 하시어 보다 상세한 내용을 확인 하시기 바랍니다.

 

https://docs.microsoft.com/ko-kr/dotnet/framework/tools/corflags-exe-corflags-conversion-tool


블로그의 정보

지금 당장 해!!!

지금당장해

활동하기