.Net Framework Side-by-Side Execution
.Net Framework 2007/06/12 00:11오늘 다룰 내용은 작년에 본인이 SmartClient를 개발 할 때, Issue의 소지가 있을 수 있겠다 생각이 들어 확인한 내용입니다. 지금이야 이런 Issue가 거의 없으리라 생각이 듭니다만, 참고 삼아 알아두셔도 나쁠 것 없을 듯 합니다.
.Net Framework Side-by-Side Execution
닷넷 개발자라면 하루도 빠짐없이 사용하는 것이 .Net Framework 일 것이다. 그리고 이 .Net Framework는 현재까지 여러 개의 버전이 배포되어 사용 중이다.(v1.1, v2.0, v3.0…) 아마 대부분의 개발자라면 모두 알고 있듯이, 하나의 machine에 여러 개의 .Net Framework를 설치하여 개발 할 수 있다. 이 문제는 .Net Framework v2.0이 배포되면서 두드러지게 나타나게 되었고, 이러한 이유로 인해서 이제는 .Net Framework의 버전까지 관리해야 하는 일이 발생하게 되었다.(당연한 이야기겠지… )
이 시점에서 제목에 나와있는 용어에 대해 집어보자. Side-by-Side Execution이라는 것은, 위에서 이야기한 하나의 machine에 여러 버전의 .Net Framework를 설치하여 실행하는 것을 이야기 한다.
하나의 machine에 여러 버전의 .Net Framework가 설치된다면… 현재 운영중인 솔루션은 어떤 버전으로 구동이 될까?.... 이건 물으나 마나, 가장 최근에 설치된 최신 버전을 기본으로 구동시키게 된다. 앗! 그렇다면, 현재 우리회사에서 개발하고 운영중인 솔루션은 v1.1로 구현되어 있는데, 만약 .Net Framework v2.0이 설치된 machine에서 실행된다면? 어쩌지? 아마 이런 문제는 .Net Framework v2.0을 도입하면서부터 고려해야 할 문제일 것이다.
상황에 따라 많은 차이가 있겠지만, .Net Framework v2.0이 추가 설치 된다고 해서, 큰 문제가 발생할까? 본인도 이 부분에 대해서 감히 어떤 말도 할 수 없지만, 이런 경우는 문제가 생길 수 있겠다. .Net Framework v2.0이 배포되면서 많은 변화가 있었다. 그 중에 눈에 띄는 것이 바로 Obsolete 객체를 예를 들 수 있는데, 이 Obsolete 객체는 v1.1에서 사용되는 객체가 v2.0으로 넘어오면서, 존재는 하지만 더 이상 사용하지 않는 객체를 말한다. v1.1 기준으로 개발된 솔루션이 v2.0에서 실행이 됐을 경우, 이런 Obsolete된 객체가 포함되어 있다면, 이는 분명히 문제가 발생 할 것이다.
그럼 이러한 문제가 발생 할 때 어떻게 할까… 그냥 .Net Framework v2.0을 uninstall? 만약 이런 상황이 안 된다면? 그럼 슬슬 고민을 하기 시작 할 것이다. 이 문제에 대해서 간단한 해결책은, 실행하고자 하는 .Net Framework의 버전을 선택하여 사용하면 된다. 그럼 원하는 버전의 .Net Framework의 버전을 어떻게 선택 할 수 있을까? 방법은 아주 간단하다. 바로 구성파일(Config)에 실행하고자 하는 .Net Framework의 버전을 명시해 주면 되는 것이다.
Change CLR’s .Net Framework Execute Version
Add-In된(일반적으로 Embed라는 용어로 많이 사용하지만, MSDN 어디를 찾아봐도 이런 용어는 찾을 수 없다. 대신 Add-In이라는 용어는 쉽게 찾을 수 있다. 이러한 이유로 본문에서는 Add-In이라는 용어를 사용하겠다.) SmartClient의 경우 IExplorer를 통해 Client로 Assembly가 다운로드 되어 실행하게 되는데, 이때 IE는 실행하게 될 Assembly가 Managed 코드로 되어 있는 것을 확인하게 되는 순간 CLR을 구동시키게 된다. 이 시점에서 CLR이 구동하는 .Net Framework의 버전을 지정을 해 준다면, 우리가 원하는 버전의 .Net Framework로 실행을 할 수 있게 되는 것이다. 이렇게 처리하기 위한 코드는 아래와 같다.
|
<configuration> <startup> <supportedRuntime version="v1.1.4322"/> </startup> </configuration> |
구성파일(Config)에 이러한 element를 추가하면, 우리가 원하는 버전의 .Net Framework를 실행 할 수 있다. 그럼 이 구성파일을 어떻게 적용하느냐를 생각해보자. 위에서도 이야기 했듯이, Add-In SmartClient일 경우 Assembly를 실행하기 위해 IE는 CLR을 구동하게 되고, 결국 구동시킬 CLR의 버전을 구분 짖는 주체 또한 IE가 되는 것이다. 그럼 답은 나왔다. 위의 구성파일을 적용시킬 대상은 IE가 되고, IE에 이 구성파일을 적용시키는 방법은 응용프로그램에서 흔히 사용하는 것과 같이 파일명을 “[응용프로그램명:확장자포함].config”로 지정해주면, 알아서 적용이 된다. IE는 C:\Program Files\Internet Explorer\ IEXPLORE.EXE에 설치되게 되므로, 구성파일 또한 C:\Program Files\Internet Explorer\ IEXPLORE.EXE.config로 저장하면 되는 것이다. 정말 간단하지 않은가~~
그런데 우리가 개발해야 하는 형태가 SmartClient뿐만이 아니지 않은가! exe형태로 실행되는 응용프로그램은 어떻게 할 수 있을까? 왠지 이런 질문이 싱겁게 생각될 것 같아.. 이 부분은 언급하지 않겠다.
그렇다면 하나 더~ ASP.NET Application은 어떨까? 이 부분에 대해서, 살짝 거들떠 보자면, ASP.NET Application은 모든 클라이언트의 요청이 IIS를 통해 들어오게 되며, IIS는 내부적으로 ASP.NET ISAPI를 호출한다. 이 ASP.NET ISAPI라는 놈은 ASP.NET Application이 어떤 버전의 .Net Framework로 실행하게 되는지를 결정하는 역할을 하는데, 모든 버전의 .Net Framework는 자신의 버전에 맞는 ASP.NET ISAPI를 가지고 있으며, 새로운 버전의 .Net Framework가 machine에 설치되면서 자기 자신의 ASP.NET ISAPI도 IIS에 등록하게 된다. 여기에서 IIS에 ASP.NET ISAPI를 등록하는 실행파일이 aspnet_regiis.exe되겠다. 많이 익숙한 파일이지 않는가? 이 aspnet_regiis.exe파일은 systemroot\Microsoft.NET\Framework\versionNumber에 위치하게 되며, 각 버전 별로 존재하기 때문에, 최신 버전의 ASP.NET ISAPI를 사용하지 않으려면, aspnet_regiis.exe 실행파일을 통해 IIS에서 해당하는 버전의 ASP.NET ISAPI를 제거(aspnet_regiis /u)하면 이러한 문제를 해결 할 수 있을 것이다.
ETC
위에서 언급한 SmartClient에 대해서 한가지 더 중요하게 생각해야 하는 게 있는데, 이것이 바로 CAS(Code Access Security)이다. SmartClient는 IE를 통해서 Assembly를 다운로드하고, 이렇게 다운로드 된 Assembly를 실행하기 위해, local에서 구동되는 CLR은 Assembly의 코드에 접근하기 위한 보안정책을 필요로 하게 되는데, 바로 이것이 CAS인 것이다. 이미 v1.1로 구현된 SmartClient의 CAS 설정은 C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG의 Security.Cofig에 저장되는데, 이러한 CAS 설정을 v2.0에 동일하게 적용시키기 위해서, CAS를 구성하는 코드를 수정할 필요 없이 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG 폴더에 그대로 Copy하면, 동일하게 CAS 설정을 적용 시킬 수 있다.
추가로, 현재 자신의 machine에 설치된 .Net Framework의 버전을 확인하고 싶다면, .Net Framework SDK 명령프롬프트를 열어서 “ClrVer”을 실행하면 확인 할 수 있다. ClrVer.exe 실행파일은 programFiles/Microsoft Visual Studio /SDK/ClrVer.exe에 위치해 있다.
Reference
http://msdn2.microsoft.com/en-us/library/aa720627(VS.71).aspx
이렇게 해서, 본문을 통해 소개하고자 하는 내용을 마치겠습니다. 사실은 정리해둔 문서의 양은 얼마 되지 않는데, 강좌 올리면서 이것저것 필요하겠다 싶어 추가를 했습니다. 작성한 글을 한번 읽어보니, 무언가가 허전한 것 같은 이 느낌~ -_-; 아놔~
그리고 참조로 올린 MSDN Url은 영문 문서와 한글 문서 같이 올려드립니다. 영문 문서를 보시면 한번에, 관계된 많은 것들을 확인 하실 수 있습니다.
'.Net Framework' 카테고리의 다른 글
| ThreadPool에서 사용 가능한 Thread의 개수는? (0) | 2008/01/08 |
|---|---|
| About ThreadPool~ (0) | 2008/01/08 |
| Generics FAQ : .Net Framework (2) | 2007/12/20 |
| throw VS throw ex (2) | 2007/12/06 |
| [소개] .NET Framework 문자열 (0) | 2007/06/12 |
| .Net Framework Side-by-Side Execution (0) | 2007/06/12 |


이올린에 북마크하기
이올린에 추천하기