성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Xamarin 2.0 - 윈도우 환경의 Visual Studio에서 C#으로 iOS/Android 응용 프로그램 개발</h1> <p> 아래의 글에서 이에 대한 자세한 소식을 들을 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Announcing Xamarin 2.0 ; <a target='tab' href='http://blog.xamarin.com/announcing-xamarin-2.0/'>http://blog.xamarin.com/announcing-xamarin-2.0/</a> </pre> <br /> 그중에서 "3. Develop iOS apps in C# with Visual Studio"에 해당하는 동영상이 재미있습니다. 아래는 그 동영상에서 2개의 화면을 캡쳐한 것입니다.<br /> <br /> <img alt='ios_in_vs_1.png' src='/SysWebRes/bbs/ios_in_vs_1.png' /><br /> <br /> <img alt='ios_in_vs_2.png' src='/SysWebRes/bbs/ios_in_vs_2.png' /><br /> <br /> 보는 바와 같이, Visual Studio에서 가상 에뮬레이터를 설정하고 곧바로 Run 키를 이용해 iOS 응용 프로그램을 테스트 할 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 예전에 안드로이드 예제를 만든 적이 있었는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 안드로이드 - Hello World 실습 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1378'>http://www.sysnet.pe.kr/2/0/1378</a> </pre> <br /> 이번엔 Xamarin 2.0으로 한번 해볼까요? ^^ 다운로드는 다음의 경로에서 간단한 사용자 정보만 입력하고 진행할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Download Xamarin Today - Build iOS, Android and Mac apps using C# and .NET. ; <a target='tab' href='http://xamarin.com/download'>http://xamarin.com/download</a> </pre> <br /> 다운로드한 파일을 실행하면 다음과 같은 구성 요소들이 설치됩니다.<br /> <br /> <img alt='ios_in_vs_3.png' src='/SysWebRes/bbs/ios_in_vs_3.png' /><br /> <br /> <ul> <li>Android SDK</li> <li>GTK#</li> <li>Xamarin Studio</li> <li>Xamarin.Android for Visual Studio and Xamarin Studio</li> <li>Xamarin.iOS for Visual Studio</li> </ul> <br /> 이제 Visual Studio를 실행해서 "New Project"를 가보면 다음과 같이 iOS와 함께 Android 관련한 프로젝트를 생성할 수 있습니다.<br /> <br /> <img alt='ios_in_vs_4.png' src='/SysWebRes/bbs/ios_in_vs_4.png' /><br /> <br /> "Android Application"을 선택하고 생성하면 다음과 같은 구조의 프로젝트가 생성됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [프로젝트] [Properties] AssemblyInfo.cs [Components] [Assets] AboutAssets.txt [Resources] [Drawable] Icon.png [Layout] Main.axml [Values] Strings.xml AboutResources.txt Resource.Designer.cs Activity1.cs </pre> <br /> 이 중에서 Activity1.cs 파일의 기본 내용은 다음과 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; namespace AndroidApplication1 { [Activity(Label = "AndroidApplication1", MainLauncher = true, Icon = "@drawable/icon")] public class Activity1 : Activity { int count = 1; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); // Get our button from the layout resource, // and attach an event to it Button button = FindViewById<Button>(Resource.Id.MyButton); button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); }; } } } </pre> <br /> 일단, 이것을 에뮬레이터에서 실행해 볼 텐데요. 윈폰의 경우에는 그냥 프로젝트에서 실행을 하면 에뮬레이터로 자동 실행이 되었지만, 안드로이드는 미리 에뮬레이터를 하나 띄워 놓아야 합니다. (참고로, 에뮬레이터 부분은 Xamarin 측에서 만든 것이 아니고, Android SDK에 포함된 것이 그대로 적용되었습니다.)<br /> <br /> 이를 위해 Visual Studio 툴바에 생긴 다음과 같은 아이콘을 누르면 됩니다.<br /> <br /> <img alt='ios_in_vs_5.png' src='/SysWebRes/bbs/ios_in_vs_5.png' /><br /> <br /> 그럼 "Android Virtual Device Manager"가 실행되고, 목록에서 원하는 가상 장치를 선택한 다음 "Start..." 버튼을 눌러주면 에뮬레이터가 실행됩니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='ios_in_vs_6.png' src='/SysWebRes/bbs/ios_in_vs_6.png' /><br /> <br /> 이제 "F5" 키를 눌러 실행하면 현재 실행 중인 에뮬레이터 목록을 보여주면서 그중에 하나를 선택할 수 있는 창이 뜹니다. <br /> <br /> <img alt='ios_in_vs_7.png' src='/SysWebRes/bbs/ios_in_vs_7.png' /><br /> <br /> 현재는 에뮬레이터를 하나만 띄워 놓았기 때문에 목록에는 하나만 있습니다. 이를 선택해서 "OK" 버튼을 누르면 "F5" 키를 눌렀으므로 디버그 모드로 프로그램이 배포되어 실행됩니다. (사실, 에뮬레이터가 그다지 훌륭하지 못해서 오류가 발생하기도 하는데요. 그런 때는 다시 "F5"를 눌러서 배포를 해주면 됩니다.)<br /> <br /> 처음에 한번은 "Mono shared runtime" + "API 8 platform framework"이 함께 설치되기 때문에 실행 속도가 느리지만, 2번째부터는 그런대로 빠르게 배포됩니다.<br /> <br /> 아래는 예제 프로젝트가 실행된 화면을 보여줍니다. 단순히 그냥 버튼을 클릭하면 그 횟수만큼의 숫자가 증가하는 단순한 프로그램입니다. ^^<br /> <br /> <img alt='ios_in_vs_8.png' src='/SysWebRes/bbs/ios_in_vs_8.png' /><br /> <br /> (참고로, 무료 버전의 한계로 인해 이렇게 배포된 프로그램은 24시간 후에는 동작을 안한다고 합니다. ^^;)<br /> <br /> 빌드된 /bin/Debug 폴더에 가보면 다음과 같은 파일들이 있습니다.<br /> <br /> <ul> <li>AndroidApplication1.AndroidApplication1.apk</li> <li>AndroidApplication1.AndroidApplication1-Signed.apk</li> <li>AndroidApplication1.dll</li> <li>AndroidApplication1.dll.mdb</li> <li>AndroidApplication1.pdb</li> </ul> <br /> apk 파일은 zip 파일인데요. 확장자를 zip으로 바꾸면 다음과 같은 구조의 폴더/파일들이 보입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [META-INF] ANDROIDD.RSA ANDROIDD.SF MANIFEST.MF [lib] [armeabi] libmonodroid.so libmono-profiler-log.so [armeabi-v7a] libmonodroid.so libmono-profiler-log.so [x86] libmonodroid.so libmono-profiler-log.so [res] [drawable] Icon.png monoandroidsplash.png [layout] main.xml monoandroidsplash.xml </pre> <br /> <hr style='width: 50%' /><br /> <br /> 그래도, 우리의 목표는 실제 폰에 배포하는 것입니다. ^^<br /> <br /> 이를 위해서는 다음과 같은 과정을 거쳐야 한다고 Xamarin 문서에 나와 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Part 1 - Preparing an Application for Release ; <a target='tab' href='http://docs.xamarin.com/guides/android/deployment%2C_testing%2C_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release'>http://docs.xamarin.com/guides/android/deployment%2C_testing%2C_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release</a> </pre> <br /> 즉, 앞으로 4단계를 더 수행해야 합니다.<br /> <br /> <ol> <li>Compile For Release </li> <li>Create a Private Key </li> <li>Sign the APK </li> <li>Zipalign the APK </li> </ol> <br /> 1번(Compile For Release)부터 해볼까요? 우선 솔루션의 빌드 옵션을 "Release"로 바꿔주고, AssemblyInfo.cs 파일에 다음과 같은 특성을 포함시킵니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > #if RELEASE [assembly: Application(Debuggable=false)] #else [assembly: Application(Debuggable=true)] #endif </pre> <br /> 이 옵션이 정상적으로 적용되려면 프로젝트 속성 창에서 "Builds" 탭의 "General" / "Conditional compilation symbols"에 "RELEASE" 상수를 입력해 두어야 합니다.<br /> <br /> 그다음 Icon을 설정하라고 하는데요. 일부 마켓 플레이스에서는 아이콘 설정이 안 되어 있으면 등록이 안 된다고 하지만, 여기서는 거기까지 해볼 수는 없으므로 그냥 생략하겠습니다.<br /> <br /> 이어서 버전 정보를 입력하라고 나오는데요. 프로젝트 속성 창에서 "Android Manifest" 탭으로 갑니다. 한 번도 manifest를 생성한 적이 없으면 "No AndroidManifest.xml found. Click to add one." 링크가 나오는데 이를 누르면 프로젝트의 "Properties" 폴더에 AndroidManifest.xml 파일이 추가되면서 편집할 수 있게 됩니다. 제 경우에는 다음과 같이 응용 프로그램 이름과 버전 정보를 넣어 주었습니다.<br /> <br /> <img alt='ios_in_vs_9.png' src='/SysWebRes/bbs/ios_in_vs_9.png' /><br /> <br /> 이렇게 하고 빌드하면 /bin/Release 폴더에는 DLL과 PDB 파일만 생성됩니다.<br /> <br /> 이어서 2번 단계(Create a Private Key)로 진행합니다. ^^<br /> <br /> 개인키를 생성하려면 JDK가 설치되어 있어야 합니다. 제 경우에는 "C:\Program Files\Java\jdk1.6.0_37\bin" 폴더에 설치되어 있고, 그 안에 포함된 keytool.exe를 이용하여 개인키를 생성했습니다.<br /> <br /> 다음은 제가 실행하고 옵션을 준 상황입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > D:\Settings>"C:\Program Files\Java\jdk1.6.0_37\bin\keytool.exe" -genkey -v -keystore my.keystore -alias AndPub -keyalg RSA -keysize 2048 -validity 10000 Enter keystore password: Re-enter new password: What is your first and last name? [Unknown]: Kevin Arnold What is the name of your organizational unit? [Unknown]: Dev What is the name of your organization? [Unknown]: Dev What is the name of your City or Locality? [Unknown]: LA What is the name of your State or Province? [Unknown]: Washington What is the two-letter country code for this unit? [Unknown]: US Is CN=Kevin Arnold, OU=Dev, O=Dev, L=LA, ST=Washington, C=US correct? [no]: y Generating 2,048 bit RSA key pair and self-signed certificate (SHA1withRSA) with a validity of 10,000 days for: CN=Kevin Arnold, OU=Dev, O=Dev, L=LA, ST=Washington, C=US Enter key password for <AndPub> (RETURN if same as keystore password): Re-enter new password: [Storing my.keystore] </pre> <br /> 이제 3번 단계(Sign the APK)로 넘어갑니다.<br /> <br /> 1번 단계(Compile For Release)를 마치고 빌드하는 경우 /bin/Release 폴더에 DLL과 PDB 파일만 생성되었다고 했는데요. 3번 단계를 통해서 서명된 APK 파일을 생성할 수 있습니다.<br /> <br /> Visual Studio의 "Tools" / "Publish Android Application..." 메뉴를 실행하면 다음과 같은 창이 나오는데, 여기에 방금 전 생성했던 keystore 파일을 지정해 주어야 합니다.<br /> <br /> <img alt='ios_in_vs_10.png' src='/SysWebRes/bbs/ios_in_vs_10.png' /><br /> <br /> "Next" 버튼을 누르면 서명된 APK 파일이 생성될 폴더를 지정할 수 있는데요. 여기서는 그냥 기본값으로 두고 "Publish" 버튼을 누르거나 원하는 값으로 바꿔도 무방합니다. (기본값은 안드로이드 프로젝트 파일 - .csproj 파일과 같은 폴더에 생성됩니다.)<br /> <br /> 여기서 좋은 소식이 하나 있는데요. 이렇게 생성된 apk 파일은 4번 단계(Zipalign the APK)까지 자동으로 반영된다고 합니다. (따라서 4번 단계는 생각할 필요가 없습니다.)<br /> <br /> 애석하게도 여기서 불편한 점이 하나 있는데요. "Publish Android Application..." 메뉴를 실행할 때마다 keystore 관련 정보를 매번 입력해 줘야 합니다. (아마도 이 부분은 나중에 개선되지 않을까 생각됩니다.)<br /> <br /> 이렇게 해서 최종 생성된 APK 파일의 내용을 보면 다음과 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [META-INF] ANDPUB.RSA ANDPUB.SF MANIFEST.MF [assemblies] AndroidApplication1.dll Mono.Android.dll Mono.Security.dll mscorlib.dll System.Core.dll System.dll [lib] [armeabi-v7a] libmonodroid.so [res] [drawable] Icon.png monoandroidsplash.png [layout] main.xml monoandroidsplash.xml </pre> <br /> <hr style='width: 50%' /><br /> <br /> APK 파일을 안드로이드 폰에 배포하는 것은 간단합니다. USB 케이블로 폰과 컴퓨터를 연결해서 외장형 USB 키에 파일을 복사하듯이 APK 파일을 복사해 주어야 하는데요. 단지, 기기마다 그 방법이 약간 다른 경우가 있는 것 같습니다.<br /> <br /> 제가 실습한 폰은 LG 껀데, "Optimus LTE TAG"라고 씌여 있군요. ^^ "설정"을 실행하고 다음의 옵션들을 변경해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > "연결" 범주 "기본연결 형식"- "대용량 저장장치" 항목을 선택 "애플리케이션" 범주 "알 수 없는 소스" - 항목을 선택 "개발" 범주로 들어가서. "USB 디버깅" - 항목을 선택 (이 옵션 설정은 나중에 사용될 일이 있습니다.) </pre> <br /> 이제, 폰과 컴퓨터를 USB 케이블로 연결하면 폰의 저장장치가 컴퓨터에 외장하드로 인식됩니다. 탐색기를 이용해, Visual Studio로 생성했던 APK 파일을 폰으로 복사하는데요. 제 경우에는 "별도로 "/myapp" 폴더를 만들고 그 안에 APK 파일을 복사했습니다.<br /> <br /> 복사가 끝났으면 케이블을 분리합니다.<br /> <br /> 그다음 "Play 스토어"에 접속해서 "ASTRO 파일 관리자"를 다운로드 받습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [apk 설치 방법] 아주 쉬운 apk 파일 설치 방법 ; <a target='tab' href='http://blog.naver.com/xxxooo88/90105655901'>http://blog.naver.com/xxxooo88/90105655901</a> </pre> <br /> 실행시켜서 "내 파일1" 항목으로 들어가면 폰을 컴퓨터에 연결했을 때와 동일한 폴더 구조를 열람할 수 있습니다. "myapp" 폴더에 apk 파일을 복사했으므로 그 안에 들어가면 "FirstTest.AndroidApp-Aligned.apk" 파일을 볼 수 있고 이 아이콘을 누르면 폰에 설치됩니다. 아래는 이렇게 해서 실행된 C# 안드로이드 앱입니다. ^^<br /> <br /> <img alt='ios_in_vs_11.png' src='/SysWebRes/bbs/ios_in_vs_11.png' /><br /> <br /> (돈만 있다면? ^^) 이제는 C#으로 못 만들 응용 프로그램이 (현실적으로) 없군요. ^^<br /> <br /> <a target='tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=766&boardid=331301885'>첨부된 파일은 위의 기본 테스트 프로젝트</a>입니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1450
(왼쪽의 숫자를 입력해야 합니다.)