2011년 1월 30일 일요일

WinForm, WinRes.exe를 이용한 지역화(Localization)



 WinForm 을 사용한 프로젝트가 있는데 한국, 미국이 아닌 제 3국에도 릴리즈 되는 제품이라 지역화를 하게 되었다. Visual Studio 에서 WinForm 디자이너에서 속성을 이용해 쉽게 다른 언어로 지역화가 가능하다.













 문제는 지역화할 폼이 많고, 또한 제 3국의 언어로 변환해야 한다면 개발자가 일일이 변환해야 하는것은 불가능! 또한 그 많은 폼에서 사요하는 문자열 리소소를 3국 언어로 변환해서 다시 개발자가 일일이 변환하는 것도 불가능!!








 WinRes.exe










위와 같은 문제 때문에 Visual Studio 에서 별도의 툴로 지원한다. 폼 디자이너를 그대로 가져온듯 하다. 


위치는 C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\WinRes.exe


물론 Visual Studio (또는 Microsoft SDKs) 설치 위치에 따라 다르며, Visual Studio 버전에 따라 다르다. Visual Studio 2008 은 v6.0A 폴더에 위치하며, Visual Studio 2010은 v7.0A 폴더에 위치한다.





resx 파일을 불러오면 VS 의 폼 디자이너와 동일하게 수정 가능하다. 주의 할 것은 resx의 기본값 언어로 작성된 파일이 꼭 필요하다. 즉, FormAddServer.en.resx 파일을 작업하려 하면 FormAddServer.resx 파일이 같은 위치에 있어야 한다.















LutzRoeder's .NET Resourcer










LutzRoeder's 개발자가 만든 WInForm 리소스 툴이다. 다운로드 주소는 









실행하여 resx 파일을 연 후, 중앙 리스트뷰에서 텍스트 변경하려는 아이템을 선택하고 하단에 변경하려는 문자열을 입력하면 된다. 모두 입력한 후에 파일 이름을 변경하려는 지역화 언어 이름을 추가하여 resx 파일로 만든 후 프로젝트에 추가하면된다.


ex) 영어 - FormAdd.en.resx

2011년 1월 25일 화요일

C# Compiler platform option (x86, x64, Itanium)




 .NET 응용프로그램은 기본적으로 특정 OS 및 CPU Architecture (x86, x64, Itanium) 을 고려하지 않아도 된다. 하지만 Native code 로 작성된 모듈과 연동을 하다보니 OS 및 CPU Architecture 도 신경을 써주게 되었다. 




.NET 응용프로그램에서 C/C++ dll 을 로드하는 경우가 있었는데 이 dll이 x64 환경에서 WOW 환경에서만 올바르게 동작이 되었다. 결국 .NET 응용프로그램을 WOW로 실행시켜야 한다. 




.NET 응용프로그램 프로젝트의 플랫폼 옵션을 변경해 주면 된다. 





MSDN 내용을 발취하면,








  • x86을 사용하면 어셈블리가 32비트, x86 호환 CLR에서 실행되도록 컴파일됩니다.

  • Itanium을 사용하면 어셈블리가 Itanium 프로세서 탑재 컴퓨터의 64비트 CLR에서 실행되도록 컴파일됩니다.

  • x64를 사용하면 어셈블리가 AMD64 또는 EM64T 명령 집합을 지원하는 컴퓨터의 64비트 CLR에서 실행되도록 컴파일됩니다.

  • anycpu(기본값)를 사용하면 어셈블리가 모든 플랫폼에서 실행되도록 컴파일됩니다.



64비트 Windows 운영 체제의 경우


  • /platform:x86으로 컴파일된 어셈블리는 WOW64에서 실행되는 32비트 CLR에서 실행됩니다.

  • /platform:anycpu로 컴파일된 실행 파일은 64비트 CLR에서 실행됩니다.

  • /platform:anycpu로 컴파일된 DLL은 이 DLL이 로드된 프로세스와 동일한 CLR에서 실행됩니다.








*)

/platform:x86 으로 컴파일된 DLL,

/platform:anycpu 으로 컴파일된 어셈블리(exe)가 있다.

이 어셈블리에서 참조 추가로 x86으로 컴파일된 DLL을 참조 추가하였을때, x64 에서 어셈블리를 실행하면 x86 DLL 사용 시 런타임 예외가 발생한다.





[C++/CLI] MFC 사용 옵션 및 Visual C++ 9.0 runtime files (vcredist)packages



MFC 라이브러리를 이용하여 C++/CLI 모듈을 만들 때, MFC 라이브러리의 MFC 사용 옵션에 주의를 기울여야 할 것 같다.










조사한 정보에 의하면 프로젝트 옵션 중 "MFC 사용" 옵션에 "공유 DLL에서 MFC 사용" 을 해야 한다고 했다. "정적 라이브러리에서 MFC 사용" 을 선택하였을 때 어떤 이슈가 있다고 읽었는데... 배포의 편의를 위해서 "정적 라이브러리에서 MFC 사용" 을 선택하고 빌드를 하였다.





 x64 OS 장비에서 테스트를 하는데 자꾸 응용프로그램이 덤프를 남기고 종료되었다. 알아보니... 위의 설정 즉, MFC 사용 옵션을 "정적 라이브러리에서 MFC 사용" 선택하여도 런타임에는 MFC 공유 모듈들을 요청하였고, 없으면 실패해서 응용프로그램이 종료되었다. 





"정적 라이브러리에서 MFC 사용" 선택하여도 "공유 DLL에서 MFC" 로 빌드한것과 같이 공유 DLL 을 참조한다.








InstallShield2008을 이용한다. 따라서 설치할때 공유 MFC dll 들을 머지 시켜 설치하면 된다.


아니면 Visual C++ 9.0 runtime files (vcredist) packages 를 수동으로 설치해서 배포 하여도 된다. 수동으로 설치 할 경우 설치 실행 파라미터 옵션은 다음과 같다.





Unattended install


vcredist_x86.exe /q:a





Unattended install with no cancel button


vcredist_x86.exe /q:a /c:"msiexec /i vcredist.msi /qb! /l*v %temp%\vcredist_x86.log"





Silent install


Vcredist_x86.exe /q:a /c:"msiexec /i vcredist.msi /qn /l*v %temp%\vcredist_x86.log"