SlideShare ist ein Scribd-Unternehmen logo
1 von 58
C#을 사용한 빠른 툴 개발 ㈜ 다이슨 인터렉티브파이퍼 스튜디오  CQ팀 이름 : 최흥배 E-Mail : jacking75@gmail.com Blog : http://blog.naver.com/jacking75스프링 노트 : http://jacking.springnote.com
Agenda 툴 개발 이야기 C#에 대한 이야기 사례 : DB 툴 사례  : 사내  패치 시스템
제 강연의 핵심은…… 기민하게 개발 툴을 만들자 생산성이 좋은 프로그래밍 언어를 사용하자
게임 만들기 바쁜데 툴 만들 시간이….
버그나 변경에 신속히 대응해야 됩니다.
문제는 C++ 과 MFC 입니다.
성능 생산성
C++과 비슷하다 C# MSDN에 한글로 (C++ 보다)쉽다 MS의 새로운 기술 활용 책과 기술 문서가 많다 풍부한 라이브러리
C#으로 만든 것 Bridge 서버관리 클라이언트 DB Tool 사내 패치 시스템 더미 클라이언트 등등 ……
C# 학습  적응 시간 C++과 연동
+ C++ C#
1. C#에서  class(struct)의 멤버를 이진  형식으로 파일에 쓸 때 class Item { intItemCd;     char       Level; BuyMoneyint; }
문제: class(struct) 단위로 파일에 쓰면 C++에서 읽어 들일 때 위치가 맞지 않음. 해결 : 각 자료 형 단위로 파일에 써야 된다.
2. C#에서  C++로 만든 서버와 통신 structPacket_Login : public PacketHead {     char	acID[21];     char       acPW[21]; }; Send( (char*)Pakcet_Login ); Void PacketProcess( char* RecvData ) { Packet_Login* pkLogin = (Packet_Login*)RecvData;         …………… }
문제: 서버에서 정의한 패킷을C#에서는 사용할 수 없으며, C++에서는 구조체로된 데이터를 보내고 받지만 C#에서는 불가능. 해결: 1. Marshaling 사용
[StructLayout(LayoutKind.Sequential, Pack = 1)]         public class ConnectBridgeRq {             public ConnectBridgeRq() {                 Header = new HEADER(); acIP = new byte[17]; }             public void GetBuffer(byte[] outBuffer)             {                 if (0 == outBuffer.Length) outBuffer = new byte[Protocol.MAX_PACKET_DATA]; unsafe                 {                     fixed (byte* fixed_buffer = outBuffer) { Marshal.StructureToPtr(this, (IntPtr)fixed_buffer, false);                     }                 }             }             public HEADER Header;	                                              // 헤더             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)]             public byte[] acIP;			               // 아이피         }
        void Send()         { LoginAuthorRetLoginPacket = new LoginAuthorRet();             LoginPacket.Header.a1 = (ushort)(Marshal.SizeOf(LoginPacket) - Marshal.SizeOf(LoginPacket.Header));             LoginPacket.Header.a2 = ClientNetworkLib.PACKET_DEFINE.PK_LOGIN_AUTHOR_REQ; intiIPLen = strIP.Length; Buffer.BlockCopy(Encoding.ASCII.GetBytes(strID), 0, LoginPacket.acIP, 0, iIPLen);             byte[] packet1 = new byte[Protocol.MAX_PACKET_DATA]; LoginPacket.GetBuffer(packet1); ClientSock.SendPacket(packet1, Marshal.SizeOf(LoginPacket));         } 서버로 보내는 패킷의 클래스 정의 및 사용이 간단하지 않음. 서버로 보낼 때는 사용할 수 있어도 받을 때는 사용하지 못함.
해결: 2. 바이트 단위로 인코딩,디코딩 인코딩 Encoder.InitEncoding(); Encoder.PushInt16(ServerCd); Encoder.PushInt16(UserCount); Encoder.PushSByte(Status); Encoder.SetPakcetDataSize(Protocol.BTSM_NOTICE_SERVER_STATUS_MSG); Sock.SendPacket(Encoder.GetBuffer(), Encoder.GetPacketBodySize());
디코딩 Decoder.SetBuffer( RecvPacket ); byte cGroupNum = Decoder.PopByte(); byte cKindNum = Decoder.PopByte(); byte cSeqNum = Decoder.PopByte(); intiReMindSecTime = Decoder.PopInt32(); 서버에서 정의한 패킷struct를 사용하지 못함. 패킷의 데이터 개수만큼 코딩량이 늘어남.  서버에서 패킷이 변경이 되었을 때 실수를 할 수가 있음.
해결: 3. 코드생성기 사용 struct PACKET_LOGIN_RQ : public PACKET_HEAD {         char	acUserID[ 21 ];         char	acUserPW[ 21 ]; };
public class CTL_LOGIN_RQ; {         public string acUserID;         public string acUserPW;         public void Encoding( EnDecoder Encoder, ushortPacketIndex )        { Encoder.InitEncoding(); Encoder.PushBytes(Encoding.ASCII.GetBytes(acUserID), 0, acUserID.Length, ProtocolDef.MAX_USERID); Encoder.PushBytes(Encoding.ASCII.GetBytes(acUserPW), 0, acUserPW.Length, ProtocolDef.MAX_USERPW); Encoder.SetPacketDataSize(PacketIndex); } public void Decoding( EnDecoder Decoder )        { Decoder.GetString(out acUserID, ProtocolDef.MAX_USERID); Decoder.GetString(out acUserPW, ProtocolDef.MAX_USERPW);        } }
C++의  packet.h파일 C#용 코드 생성 코딩 량 사용의 편리함
패킷용struct코드가 일정한 형식으로 만들어져 있지 않으면 코드 생성기  구현이 복잡해진다. 코드에 일정한 형식을 만든다 XML 등으로 struct의 내용을 정의한다
// [[LoginServer에 로긴 요청]] // [- CTL_LOGIN_RQ]		 struct PACKET_LOGIN_RQ : public PACKET_HEAD { 	char	acUserID[ 21 ]; 	char	acUserPW[ 21 ]; };
3. C#에서  WM_COPYDATA 사용 문제: .NET에서는 WM_COPYDATA 라는 것이 없음 해결 : 관리 되지 않는 코드를 사용 참고 URL http://www.codeproject.com/KB/cs/ipc_wmcopy.aspxhttp://www.codeproject.com/KB/threads/InterprocessCommunicator.aspxhttp://www.codeproject.com/KB/cs/wm_copydata_use.aspx
4. C#에서  C++ 코드 사용 C++ 코드를 DLL C++/CLI로 Wraping C#에서 사용 참고 URL http://sj21.wo.to/tt/483 http://sj21.wo.to/tt/484 http://blogs.msdn.com/junfeng/archive/2006/05/20/599434.aspx
DB Tool
기존의 불편함……
데이터베이스 조작을 쉽게
DB에 DataImport
DB에서 DataExport
서버 프로그래머의 일 DB 조작이 필요한 사람의 대기 시간 테스트 편리함
DB는 변경 됩니다 DBTool도 빠르게 변경 해야 합니다
DB 데이터를 xml 파일로 저장 DataSetResultDataSet = new DataSet(); string strQuery = "SELECT * FROM " + TableName; DbCommandcmd =  ConnectionInstance.CreateCommand(); cmd.CommandText = strQuery; DataAdapter.SelectCommand = cmd; DataAdapter.Fill(ResultDataSet, strTable); ResultDataSet.WriteXml(“ItemTable.xml”);
C++로 한다면…….. 코드로 표현 하기에는 너무 길어서 간략한 의사 코드로 XML 파서 선택 XML 파서 사용 법 학습 DB 쿼리 각 Table에 맞게 데이터 읽기 참고 http://jacking75.cafe24.com/Tip/TinyXml_SimpleUse.htm 각 Table에 맞게 XML 형식으로 쓰기
xml  데이터를 DB 에 저장 DataSetResultDataSet = new DataSet(); string strQuery = "SELECT * FROM " + “테이블 이름”; DataSetds = new DataSet(); ds.ReadXml(“XML 파일”); …….. DataAdapter.Update(dataset, TableName);
사내 패치 시스템
클라이언트 버전간에 파일이 바뀐 것은 파일 통째로 패치 한다. ( 파일 내용이 일부만 변경 되더라도 전체를 바꿈 ) 현재 버전과 다음 버전간의 패치만 만든다 (현재 버전이 3이라면 버전 1과 2, 2와 3 의 패치 파일이 있어야 한다.
패치 파일 배포는 웹 서버를 사용한다. 런처 프로그램은 자동 업데이트 기능이 있어야 한다.
제작 기간 4일 다른 일 하면서… 시간 날 때마다…
1. 웹 서버 설치 사내에서 사용하고 있는 웹 서버를 사용하던가  Windows 플랫폼이라면 IIS를 사용한다.
2. 패치 파일 생성 프로그램 제작
실제 코드 량은 100 라인 이내 패치 파일을 압축 하기 위해 SharpZibLib사용  (공개 라이브러리 사용)
주로 사용한 API 지정된 폴더에 있는 모든 파일을 조사 string[] Cur_AllFiles =  Directory.GetFiles(textBox1.Text, "*.*",  SearchOption.AllDirectories); 파일 비교를 위해 FileInfoCur_fileinfo = new FileInfo(CurVerFile); Cur_fileinfo.LastWriteTime Cur_fileinfo.Length
SharpZipLib사용 SharpZipLib :  http://icsharpcode.net/OpenSource/SharpZipLib/Default.aspx 사용 법 http://dobon.net/vb/dotnet/links/createzipfile.html
3. 런처 프로그램 제작
실제 코드 량은 200  ~ 300 라인 이내 런처 업데이트를 위해 ‘AutoIt’  스크립트 언어 사용
주로 사용한 API 웹 페이지 출력 WebBrowser컨트롤 사용 webBrowser.Navigate(“http://blog.naver.com/jacking75");
웹 서버에 있는 설정 파일 다운로드 및 읽기 WebRequestmyWebRequest =  WebRequest.Create(“다운로드 할 파일 이름”); WebResponsemyWebResponse = myWebRequest.GetResponse(); Stream ReceiveStream =  myWebResponse.GetResponseStream(); StreamReadersr = new StreamReader(ReceiveStream);
패치 파일 다운로드 하기 WebClientmyWebClient = new WebClient(); myStringWebResource = remoteUri + fileName; myWebClient.DownloadFile( myStringWebResource, fileName);
워커스레드에서 컨트롤 조작하기 http://blog.naver.com/jacking75/140054848037
런처 재 실행을 위한 AutoIt스크립트 MsgBox( 0, "런처 업데이트", "런처가 업데이트 되었습니다. 잠시 후 다시 시작합니다" ) ; 1.5초 Sleep( 1500 ) ProcessClose("CQGame.exe") ; 1.5초 Sleep( 1500 ) ; 기존 파일 삭제 FileDelete( “CQGame.exe" ) ; 새 파일 이름 변경 FileMove( "New_CQGame.exe", "CQGame.exe", 1 ) FileDelete( "New_CQGame.exe" ) ; 실행 Run( "CQGame.exe" )
.NET Framework가  없어도 C# 프로그램 실행 가능 PostBuilder를 사용하면 된다 http://www.xenocode.com/Products/Postbuild/ 외부 서비스에서도 바로 사용할 수 있다
C++ C# Python Ruby
C# 관련 검색은 MSDN 데브피아 네이버 구글
추천 책 Effective C# : 강력한 C# 코드를 구현하는 개발지침 50가지 닷넷 프로그래밍 정복: C#, 윈폼, ADO MSDN 생각하는 C#.LINQ 윈도우 프로젝트 필수 유틸리티: Subversion, Trac, CruiseControl.NET

Weitere ähnliche Inhalte

Was ist angesagt?

What is Game Server ?
What is Game Server ?What is Game Server ?
What is Game Server ?흥배 최
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀승명 양
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019devCAT Studio, NEXON
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기Seungjae Lee
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013영욱 오
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직Hoyoung Choi
 
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건강 민우
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)Bongseok Cho
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현YEONG-CHEON YOU
 
NDC11_슈퍼클래스
NDC11_슈퍼클래스NDC11_슈퍼클래스
NDC11_슈퍼클래스noerror
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019devCAT Studio, NEXON
 
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다Lee Dustin
 
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템tcaesvk
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Esun Kim
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremSeungmo Koo
 
프로그래머에게 사랑받는 게임 기획서 작성법
프로그래머에게 사랑받는 게임 기획서 작성법프로그래머에게 사랑받는 게임 기획서 작성법
프로그래머에게 사랑받는 게임 기획서 작성법Lee Sangkyoon (Kay)
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략YEONG-CHEON YOU
 
Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기YEONG-CHEON YOU
 
[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능Yongha Kim
 
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019devCAT Studio, NEXON
 

Was ist angesagt? (20)

What is Game Server ?
What is Game Server ?What is Game Server ?
What is Game Server ?
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직
 
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
NDC11_슈퍼클래스
NDC11_슈퍼클래스NDC11_슈퍼클래스
NDC11_슈퍼클래스
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
 
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
 
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
NDC 2013, 마비노기 영웅전 개발 테크니컬 포스트-모템
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
프로그래머에게 사랑받는 게임 기획서 작성법
프로그래머에게 사랑받는 게임 기획서 작성법프로그래머에게 사랑받는 게임 기획서 작성법
프로그래머에게 사랑받는 게임 기획서 작성법
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기
 
[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능
 
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
 

Andere mochten auch

C#으로 게임 엔진 만들기(1)
C#으로 게임 엔진 만들기(1)C#으로 게임 엔진 만들기(1)
C#으로 게임 엔진 만들기(1)지환 김
 
취미로 엔진 만들기
취미로 엔진 만들기취미로 엔진 만들기
취미로 엔진 만들기Jiho Choi
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴예림 임
 
게임 프레임워크의 아키텍쳐와 디자인 패턴
게임 프레임워크의 아키텍쳐와 디자인 패턴게임 프레임워크의 아키텍쳐와 디자인 패턴
게임 프레임워크의 아키텍쳐와 디자인 패턴MinGeun Park
 
Kgc2012 온라인 게임을 위한 게임 오브젝트 설계
Kgc2012 온라인 게임을 위한 게임 오브젝트 설계Kgc2012 온라인 게임을 위한 게임 오브젝트 설계
Kgc2012 온라인 게임을 위한 게임 오브젝트 설계kgun86
 
04게임의뼈대세우기
04게임의뼈대세우기04게임의뼈대세우기
04게임의뼈대세우기태성 이
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback흥배 최
 
게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법Chris Ohk
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)Heungsub Lee
 
C#으로 게임 엔진 만들기(3)
C#으로 게임 엔진 만들기(3)C#으로 게임 엔진 만들기(3)
C#으로 게임 엔진 만들기(3)지환 김
 
C#으로 게임 엔진 만들기(2)
C#으로 게임 엔진 만들기(2)C#으로 게임 엔진 만들기(2)
C#으로 게임 엔진 만들기(2)지환 김
 
[0211 박민근] mmorpg에서의 모델툴 개발
[0211 박민근] mmorpg에서의 모델툴 개발[0211 박민근] mmorpg에서의 모델툴 개발
[0211 박민근] mmorpg에서의 모델툴 개발MinGeun Park
 
아이템 발굴 핸드워킹 시트
아이템 발굴 핸드워킹 시트아이템 발굴 핸드워킹 시트
아이템 발굴 핸드워킹 시트Seung Min Shin
 
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
Ndc2010   김주복, v3. 마비노기2아키텍처리뷰Ndc2010   김주복, v3. 마비노기2아키텍처리뷰
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰Jubok Kim
 
자바_웹_개발자를_위한_c#_핵심_기능
자바_웹_개발자를_위한_c#_핵심_기능자바_웹_개발자를_위한_c#_핵심_기능
자바_웹_개발자를_위한_c#_핵심_기능Dexter Jung
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
KGC10 - Visual C++10과 디버깅
KGC10 - Visual C++10과 디버깅KGC10 - Visual C++10과 디버깅
KGC10 - Visual C++10과 디버깅흥배 최
 
Performance is a feature! - London .NET User Group
Performance is a feature! - London .NET User GroupPerformance is a feature! - London .NET User Group
Performance is a feature! - London .NET User GroupMatt Warren
 
C#프로그래밍, 어떻게 시작하는가
C#프로그래밍, 어떻게 시작하는가C#프로그래밍, 어떻게 시작하는가
C#프로그래밍, 어떻게 시작하는가GukHwan Ji
 

Andere mochten auch (20)

C#으로 게임 엔진 만들기(1)
C#으로 게임 엔진 만들기(1)C#으로 게임 엔진 만들기(1)
C#으로 게임 엔진 만들기(1)
 
취미로 엔진 만들기
취미로 엔진 만들기취미로 엔진 만들기
취미로 엔진 만들기
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴
 
게임 프레임워크의 아키텍쳐와 디자인 패턴
게임 프레임워크의 아키텍쳐와 디자인 패턴게임 프레임워크의 아키텍쳐와 디자인 패턴
게임 프레임워크의 아키텍쳐와 디자인 패턴
 
Kgc2012 온라인 게임을 위한 게임 오브젝트 설계
Kgc2012 온라인 게임을 위한 게임 오브젝트 설계Kgc2012 온라인 게임을 위한 게임 오브젝트 설계
Kgc2012 온라인 게임을 위한 게임 오브젝트 설계
 
04게임의뼈대세우기
04게임의뼈대세우기04게임의뼈대세우기
04게임의뼈대세우기
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
 
게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
C#으로 게임 엔진 만들기(3)
C#으로 게임 엔진 만들기(3)C#으로 게임 엔진 만들기(3)
C#으로 게임 엔진 만들기(3)
 
C#으로 게임 엔진 만들기(2)
C#으로 게임 엔진 만들기(2)C#으로 게임 엔진 만들기(2)
C#으로 게임 엔진 만들기(2)
 
[0211 박민근] mmorpg에서의 모델툴 개발
[0211 박민근] mmorpg에서의 모델툴 개발[0211 박민근] mmorpg에서의 모델툴 개발
[0211 박민근] mmorpg에서의 모델툴 개발
 
아이템 발굴 핸드워킹 시트
아이템 발굴 핸드워킹 시트아이템 발굴 핸드워킹 시트
아이템 발굴 핸드워킹 시트
 
Hello, C# : OOP
Hello, C# : OOPHello, C# : OOP
Hello, C# : OOP
 
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
Ndc2010   김주복, v3. 마비노기2아키텍처리뷰Ndc2010   김주복, v3. 마비노기2아키텍처리뷰
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
 
자바_웹_개발자를_위한_c#_핵심_기능
자바_웹_개발자를_위한_c#_핵심_기능자바_웹_개발자를_위한_c#_핵심_기능
자바_웹_개발자를_위한_c#_핵심_기능
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
KGC10 - Visual C++10과 디버깅
KGC10 - Visual C++10과 디버깅KGC10 - Visual C++10과 디버깅
KGC10 - Visual C++10과 디버깅
 
Performance is a feature! - London .NET User Group
Performance is a feature! - London .NET User GroupPerformance is a feature! - London .NET User Group
Performance is a feature! - London .NET User Group
 
C#프로그래밍, 어떻게 시작하는가
C#프로그래밍, 어떻게 시작하는가C#프로그래밍, 어떻게 시작하는가
C#프로그래밍, 어떻게 시작하는가
 

Ähnlich wie C#을 사용한 빠른 툴 개발

Google Protocol buffer
Google Protocol bufferGoogle Protocol buffer
Google Protocol bufferknight1128
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택JinTaek Seo
 
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011Esun Kim
 
리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초Yu Yongwoo
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계Chiwon Song
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리Seungyong Lee
 
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)Sang Don Kim
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처Sunggon Song
 
Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)Eunbee Song
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계Sungkyun Kim
 
.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기Seong Won Mun
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
Webrtc 허영남 20150528
Webrtc 허영남 20150528Webrtc 허영남 20150528
Webrtc 허영남 20150528영남 허
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나Astin Choi
 
Bug sense 분석
Bug sense 분석Bug sense 분석
Bug sense 분석logdog
 
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장MinPa Lee
 
POSTGRES_사칙연산_익스텐션만들기.pdf
POSTGRES_사칙연산_익스텐션만들기.pdfPOSTGRES_사칙연산_익스텐션만들기.pdf
POSTGRES_사칙연산_익스텐션만들기.pdfLee Dong Wook
 
윈도우 커널 익스플로잇
윈도우 커널 익스플로잇윈도우 커널 익스플로잇
윈도우 커널 익스플로잇Seungyong Lee
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11OnGameServer
 

Ähnlich wie C#을 사용한 빠른 툴 개발 (20)

Google Protocol buffer
Google Protocol bufferGoogle Protocol buffer
Google Protocol buffer
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011
 
리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리
 
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
 
04 프로세스
04 프로세스04 프로세스
04 프로세스
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처
 
Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
 
.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
Webrtc 허영남 20150528
Webrtc 허영남 20150528Webrtc 허영남 20150528
Webrtc 허영남 20150528
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나
 
Bug sense 분석
Bug sense 분석Bug sense 분석
Bug sense 분석
 
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
 
POSTGRES_사칙연산_익스텐션만들기.pdf
POSTGRES_사칙연산_익스텐션만들기.pdfPOSTGRES_사칙연산_익스텐션만들기.pdf
POSTGRES_사칙연산_익스텐션만들기.pdf
 
윈도우 커널 익스플로잇
윈도우 커널 익스플로잇윈도우 커널 익스플로잇
윈도우 커널 익스플로잇
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
 

Mehr von 흥배 최

Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용흥배 최
 
Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]흥배 최
 
Bash on Ubuntu on Windows
Bash on Ubuntu on WindowsBash on Ubuntu on Windows
Bash on Ubuntu on Windows흥배 최
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기흥배 최
 
Wtl 개요와 설치
Wtl 개요와 설치Wtl 개요와 설치
Wtl 개요와 설치흥배 최
 
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발흥배 최
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
닷넷 Apache avro
닷넷 Apache avro닷넷 Apache avro
닷넷 Apache avro흥배 최
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개흥배 최
 
Mongodb 관리
Mongodb 관리Mongodb 관리
Mongodb 관리흥배 최
 
Mongodb 개발 포인트
Mongodb 개발 포인트Mongodb 개발 포인트
Mongodb 개발 포인트흥배 최
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션흥배 최
 
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임흥배 최
 
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기흥배 최
 
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서흥배 최
 
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템흥배 최
 
MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용흥배 최
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability흥배 최
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍흥배 최
 

Mehr von 흥배 최 (20)

Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
 
Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]
 
Bash on Ubuntu on Windows
Bash on Ubuntu on WindowsBash on Ubuntu on Windows
Bash on Ubuntu on Windows
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
Wtl 개요와 설치
Wtl 개요와 설치Wtl 개요와 설치
Wtl 개요와 설치
 
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
NLog 소개
NLog 소개NLog 소개
NLog 소개
 
닷넷 Apache avro
닷넷 Apache avro닷넷 Apache avro
닷넷 Apache avro
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개
 
Mongodb 관리
Mongodb 관리Mongodb 관리
Mongodb 관리
 
Mongodb 개발 포인트
Mongodb 개발 포인트Mongodb 개발 포인트
Mongodb 개발 포인트
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
 
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
 
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기
 
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
 
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
 
MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 

C#을 사용한 빠른 툴 개발

  • 1. C#을 사용한 빠른 툴 개발 ㈜ 다이슨 인터렉티브파이퍼 스튜디오 CQ팀 이름 : 최흥배 E-Mail : jacking75@gmail.com Blog : http://blog.naver.com/jacking75스프링 노트 : http://jacking.springnote.com
  • 2. Agenda 툴 개발 이야기 C#에 대한 이야기 사례 : DB 툴 사례 : 사내 패치 시스템
  • 3. 제 강연의 핵심은…… 기민하게 개발 툴을 만들자 생산성이 좋은 프로그래밍 언어를 사용하자
  • 4. 게임 만들기 바쁜데 툴 만들 시간이….
  • 5.
  • 6. 버그나 변경에 신속히 대응해야 됩니다.
  • 7.
  • 8. 문제는 C++ 과 MFC 입니다.
  • 10. C++과 비슷하다 C# MSDN에 한글로 (C++ 보다)쉽다 MS의 새로운 기술 활용 책과 기술 문서가 많다 풍부한 라이브러리
  • 11. C#으로 만든 것 Bridge 서버관리 클라이언트 DB Tool 사내 패치 시스템 더미 클라이언트 등등 ……
  • 12. C# 학습 적응 시간 C++과 연동
  • 14. 1. C#에서 class(struct)의 멤버를 이진 형식으로 파일에 쓸 때 class Item { intItemCd; char Level; BuyMoneyint; }
  • 15. 문제: class(struct) 단위로 파일에 쓰면 C++에서 읽어 들일 때 위치가 맞지 않음. 해결 : 각 자료 형 단위로 파일에 써야 된다.
  • 16. 2. C#에서 C++로 만든 서버와 통신 structPacket_Login : public PacketHead { char acID[21]; char acPW[21]; }; Send( (char*)Pakcet_Login ); Void PacketProcess( char* RecvData ) { Packet_Login* pkLogin = (Packet_Login*)RecvData; …………… }
  • 17. 문제: 서버에서 정의한 패킷을C#에서는 사용할 수 없으며, C++에서는 구조체로된 데이터를 보내고 받지만 C#에서는 불가능. 해결: 1. Marshaling 사용
  • 18. [StructLayout(LayoutKind.Sequential, Pack = 1)] public class ConnectBridgeRq { public ConnectBridgeRq() { Header = new HEADER(); acIP = new byte[17]; } public void GetBuffer(byte[] outBuffer) { if (0 == outBuffer.Length) outBuffer = new byte[Protocol.MAX_PACKET_DATA]; unsafe { fixed (byte* fixed_buffer = outBuffer) { Marshal.StructureToPtr(this, (IntPtr)fixed_buffer, false); } } } public HEADER Header; // 헤더 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)] public byte[] acIP; // 아이피 }
  • 19. void Send() { LoginAuthorRetLoginPacket = new LoginAuthorRet(); LoginPacket.Header.a1 = (ushort)(Marshal.SizeOf(LoginPacket) - Marshal.SizeOf(LoginPacket.Header)); LoginPacket.Header.a2 = ClientNetworkLib.PACKET_DEFINE.PK_LOGIN_AUTHOR_REQ; intiIPLen = strIP.Length; Buffer.BlockCopy(Encoding.ASCII.GetBytes(strID), 0, LoginPacket.acIP, 0, iIPLen); byte[] packet1 = new byte[Protocol.MAX_PACKET_DATA]; LoginPacket.GetBuffer(packet1); ClientSock.SendPacket(packet1, Marshal.SizeOf(LoginPacket)); } 서버로 보내는 패킷의 클래스 정의 및 사용이 간단하지 않음. 서버로 보낼 때는 사용할 수 있어도 받을 때는 사용하지 못함.
  • 20. 해결: 2. 바이트 단위로 인코딩,디코딩 인코딩 Encoder.InitEncoding(); Encoder.PushInt16(ServerCd); Encoder.PushInt16(UserCount); Encoder.PushSByte(Status); Encoder.SetPakcetDataSize(Protocol.BTSM_NOTICE_SERVER_STATUS_MSG); Sock.SendPacket(Encoder.GetBuffer(), Encoder.GetPacketBodySize());
  • 21. 디코딩 Decoder.SetBuffer( RecvPacket ); byte cGroupNum = Decoder.PopByte(); byte cKindNum = Decoder.PopByte(); byte cSeqNum = Decoder.PopByte(); intiReMindSecTime = Decoder.PopInt32(); 서버에서 정의한 패킷struct를 사용하지 못함. 패킷의 데이터 개수만큼 코딩량이 늘어남. 서버에서 패킷이 변경이 되었을 때 실수를 할 수가 있음.
  • 22. 해결: 3. 코드생성기 사용 struct PACKET_LOGIN_RQ : public PACKET_HEAD { char acUserID[ 21 ]; char acUserPW[ 21 ]; };
  • 23. public class CTL_LOGIN_RQ; { public string acUserID; public string acUserPW; public void Encoding( EnDecoder Encoder, ushortPacketIndex ) { Encoder.InitEncoding(); Encoder.PushBytes(Encoding.ASCII.GetBytes(acUserID), 0, acUserID.Length, ProtocolDef.MAX_USERID); Encoder.PushBytes(Encoding.ASCII.GetBytes(acUserPW), 0, acUserPW.Length, ProtocolDef.MAX_USERPW); Encoder.SetPacketDataSize(PacketIndex); } public void Decoding( EnDecoder Decoder ) { Decoder.GetString(out acUserID, ProtocolDef.MAX_USERID); Decoder.GetString(out acUserPW, ProtocolDef.MAX_USERPW); } }
  • 24. C++의 packet.h파일 C#용 코드 생성 코딩 량 사용의 편리함
  • 25. 패킷용struct코드가 일정한 형식으로 만들어져 있지 않으면 코드 생성기 구현이 복잡해진다. 코드에 일정한 형식을 만든다 XML 등으로 struct의 내용을 정의한다
  • 26. // [[LoginServer에 로긴 요청]] // [- CTL_LOGIN_RQ] struct PACKET_LOGIN_RQ : public PACKET_HEAD { char acUserID[ 21 ]; char acUserPW[ 21 ]; };
  • 27. 3. C#에서 WM_COPYDATA 사용 문제: .NET에서는 WM_COPYDATA 라는 것이 없음 해결 : 관리 되지 않는 코드를 사용 참고 URL http://www.codeproject.com/KB/cs/ipc_wmcopy.aspxhttp://www.codeproject.com/KB/threads/InterprocessCommunicator.aspxhttp://www.codeproject.com/KB/cs/wm_copydata_use.aspx
  • 28. 4. C#에서 C++ 코드 사용 C++ 코드를 DLL C++/CLI로 Wraping C#에서 사용 참고 URL http://sj21.wo.to/tt/483 http://sj21.wo.to/tt/484 http://blogs.msdn.com/junfeng/archive/2006/05/20/599434.aspx
  • 34. 서버 프로그래머의 일 DB 조작이 필요한 사람의 대기 시간 테스트 편리함
  • 35. DB는 변경 됩니다 DBTool도 빠르게 변경 해야 합니다
  • 36. DB 데이터를 xml 파일로 저장 DataSetResultDataSet = new DataSet(); string strQuery = "SELECT * FROM " + TableName; DbCommandcmd = ConnectionInstance.CreateCommand(); cmd.CommandText = strQuery; DataAdapter.SelectCommand = cmd; DataAdapter.Fill(ResultDataSet, strTable); ResultDataSet.WriteXml(“ItemTable.xml”);
  • 37. C++로 한다면…….. 코드로 표현 하기에는 너무 길어서 간략한 의사 코드로 XML 파서 선택 XML 파서 사용 법 학습 DB 쿼리 각 Table에 맞게 데이터 읽기 참고 http://jacking75.cafe24.com/Tip/TinyXml_SimpleUse.htm 각 Table에 맞게 XML 형식으로 쓰기
  • 38. xml 데이터를 DB 에 저장 DataSetResultDataSet = new DataSet(); string strQuery = "SELECT * FROM " + “테이블 이름”; DataSetds = new DataSet(); ds.ReadXml(“XML 파일”); …….. DataAdapter.Update(dataset, TableName);
  • 40. 클라이언트 버전간에 파일이 바뀐 것은 파일 통째로 패치 한다. ( 파일 내용이 일부만 변경 되더라도 전체를 바꿈 ) 현재 버전과 다음 버전간의 패치만 만든다 (현재 버전이 3이라면 버전 1과 2, 2와 3 의 패치 파일이 있어야 한다.
  • 41. 패치 파일 배포는 웹 서버를 사용한다. 런처 프로그램은 자동 업데이트 기능이 있어야 한다.
  • 42. 제작 기간 4일 다른 일 하면서… 시간 날 때마다…
  • 43. 1. 웹 서버 설치 사내에서 사용하고 있는 웹 서버를 사용하던가 Windows 플랫폼이라면 IIS를 사용한다.
  • 44. 2. 패치 파일 생성 프로그램 제작
  • 45. 실제 코드 량은 100 라인 이내 패치 파일을 압축 하기 위해 SharpZibLib사용 (공개 라이브러리 사용)
  • 46. 주로 사용한 API 지정된 폴더에 있는 모든 파일을 조사 string[] Cur_AllFiles = Directory.GetFiles(textBox1.Text, "*.*", SearchOption.AllDirectories); 파일 비교를 위해 FileInfoCur_fileinfo = new FileInfo(CurVerFile); Cur_fileinfo.LastWriteTime Cur_fileinfo.Length
  • 47. SharpZipLib사용 SharpZipLib : http://icsharpcode.net/OpenSource/SharpZipLib/Default.aspx 사용 법 http://dobon.net/vb/dotnet/links/createzipfile.html
  • 49. 실제 코드 량은 200 ~ 300 라인 이내 런처 업데이트를 위해 ‘AutoIt’ 스크립트 언어 사용
  • 50. 주로 사용한 API 웹 페이지 출력 WebBrowser컨트롤 사용 webBrowser.Navigate(“http://blog.naver.com/jacking75");
  • 51. 웹 서버에 있는 설정 파일 다운로드 및 읽기 WebRequestmyWebRequest = WebRequest.Create(“다운로드 할 파일 이름”); WebResponsemyWebResponse = myWebRequest.GetResponse(); Stream ReceiveStream = myWebResponse.GetResponseStream(); StreamReadersr = new StreamReader(ReceiveStream);
  • 52. 패치 파일 다운로드 하기 WebClientmyWebClient = new WebClient(); myStringWebResource = remoteUri + fileName; myWebClient.DownloadFile( myStringWebResource, fileName);
  • 53. 워커스레드에서 컨트롤 조작하기 http://blog.naver.com/jacking75/140054848037
  • 54. 런처 재 실행을 위한 AutoIt스크립트 MsgBox( 0, "런처 업데이트", "런처가 업데이트 되었습니다. 잠시 후 다시 시작합니다" ) ; 1.5초 Sleep( 1500 ) ProcessClose("CQGame.exe") ; 1.5초 Sleep( 1500 ) ; 기존 파일 삭제 FileDelete( “CQGame.exe" ) ; 새 파일 이름 변경 FileMove( "New_CQGame.exe", "CQGame.exe", 1 ) FileDelete( "New_CQGame.exe" ) ; 실행 Run( "CQGame.exe" )
  • 55. .NET Framework가 없어도 C# 프로그램 실행 가능 PostBuilder를 사용하면 된다 http://www.xenocode.com/Products/Postbuild/ 외부 서비스에서도 바로 사용할 수 있다
  • 57. C# 관련 검색은 MSDN 데브피아 네이버 구글
  • 58. 추천 책 Effective C# : 강력한 C# 코드를 구현하는 개발지침 50가지 닷넷 프로그래밍 정복: C#, 윈폼, ADO MSDN 생각하는 C#.LINQ 윈도우 프로젝트 필수 유틸리티: Subversion, Trac, CruiseControl.NET