'SocketAsyncEventArgs'의 이해를 위한 글을 여러 번 썼었는데..... '.NET 5' 이후로는 'SocketAsyncEventArgs'가 이전과 살짝 다른 동작을 합니다. 그래서 '.NET 5'로 넘어가기 전에 총정리 겸 단계별 샘플을 만들었습니다. 연관글 영역 0. 구조 각 샘플은 거의 같은 구조로 되어 있습니다. 샘플 소스 : dang-gun/DGSocketAssist/ dang-gun/DGSocketAssist/DGSocketAssist1/ 라이브러리 형태로 만들어져 있어 "DGSocketAssist_Server", "DGSocketAssist_Client"만 참조하여 서버/클라이언트 프로그램을 만들 수 있습니다. 1. 'DGSocketAssist1_Server' 이해하기 'DGS..
별생각 없이 콘솔로 프로그램을 만들었는데.... 기본적으로 있는 콘솔 모드들 때문에 이상한 동작을 하는 경우가 있습니다. 대표적인 것이 "빠른 편집 모드(Quick Edit Mode)"라는 것인데 콘솔 창을 클릭하거나 드레그하면 응용프로그램이 멈추는 현상입니다. 이 모드를 바꾸는 방법을 알아봅시다. 연관글 영역 1. WinApi를 사용해야 한다. 몇 가지 방법들이 있지만 결국은 WinApi를 이용하는 것이 가장 편합니다. WinApi로 콘솔 모드를 변경하려면 1) 디바이스(여기서는 콘솔)의 핸들을 받아서 2) 콘솔 모드 설정값을 받아온 뒤 3) 받은 설정값이 원하는 설정을 추가(혹은 제거)하고 4) 콘솔 모드 설정값을 다시 설정합니다. 설정값이 uint(UInt32)로 된 플래그(flag) 값이라 비트연..
다른 포스팅에서 타이머의 정밀도 문제로 FPS(Frames Per Second)를 구하면 정확하지 않다고 이야기를 했었습니다. (참고 : [.NET] 게임 루프(Game Loop)를 구현할 때는 'Environment.TickCount'를 사용하면 안 된다. ) 스톱워치(Stopwatch)를 이용한 정밀 타이머를 만들어 보고, 이것을 이용하여 둘의 차이가 얼마나 나는지 알아봅시다. 1. 타이머 구현 스톱워치 타이머를 구현하려면 1) 무한 루프를 돌리고 2) 우리가 원하는 간격에 이벤트를 보내는 3) 비동기 쓰래드를 만들어야 합니다. 구현은 아래와 같이 합니다. public async Task Start() { bool bLoop = true; long nLastTime = 0; Stopwatch sw =..
.NET으로 사운드 파일을 재생하려면 보통 'SoundPlayer'를 사용합니다. 근데 이놈은 한 번에 하나의 파일만 재생이 가능합니다. 여러 파일을 재생하려면 'DirectX SDK', 'Windows Media Player SDK', 'NAudio' 같은 외부 라이브러리를 이용하거나 'WinAPI'를 이용해야 합니다. 이 포스팅에서는 'WinAPI'의 'mciSendString'를 이용하여 재생하겠습니다. 1. 'SoundPlayer'를 사용해 보자 'SoundPlayer'를 사용하여 파일을 재생해봅시다. 아래와 같이 개체를 초기화하고 private SoundPlayer _soundPlayer1; this._soundPlayer1 = new SoundPlayer(); this._soundPlayer1..
Environment.TickCount를 써서 게임 루프(Game Loop)를 만들었는데 계산한 FPS와 다르게 나옵니다??? 1. 'Environment.TickCount'의 문제원인을 찾던 중 발견한 내용MS Docs - <a href="https://docs.microsoft.com/ko-kr/dotnet/api/system.environment.tickcount?view=net-6..
요즘은 응용프로그램을 각 잡고 배포할 일이 없어서 신경 쓰지 않았지만...... 사실 배포 시 참조되는 DLL을 구분해야 합니다. 1. 개발용 DLL과 배포용 DLL 내부에서 만든 DLL인 경우 편한 디버깅을 위해 디버깅용 정보가 들어있는걸 쓰고 배포 시에는 릴리즈용 DLL을 씁니다. 테스트용 DLL을 만들어 봅시다. 2. 그냥 하면 어떻게 되는가? 이제 일반적인 참조방식으로 어떻게 되는지 확인해 봅시다. 2-1. 프로젝트 참조 이제 프로젝트 참조를 한 프로젝트에서는 어떻게 돌아가는지 봅시다. 자동으로 잘 구분하여 참조합니다. 2-2. 직접 참조 DLL을 직접 참조한 프로젝트는 어떤지 확인해 봅시다. 당연히 직접 참조한 DLL만 따라가는 것을 볼 수 있습니다. 그렇다면 디버그와 릴리즈를 어떻게 구분하느냐..
이 포스팅에서는 응용프로그램(WinForm, WPF...)에서 ASP.NET를 포함한 웹 서비스를 제공하는 방법을 다룹니다. 퍼블리싱된 파일을 서비스하는 것이 아닙니다. 웹서버를 구현한다고도 볼 수 있는데..... IIS나 Kestrel처럼 퍼블리싱된 파일을 읽어서 서비스하는 방식은 아닙니다. (그렇다고 구현방식이 다른 건 아닙니다 ㅎㅎㅎㅎ) 1. 프로젝트 생성 프로젝트는 ".Net 5 WinForm 애플리케이션"으로 생성합니다. 여기서는 "웹 응용 프로그램 MVC (모델-뷰-컨트롤러)"로 생성합니다. 'Form1'의 이름을 'MainForm'으로 바꿉니다. 폼을 다음과 같이 구성합니다. 버튼을 누르면 브라우저가 열리도록 코드를 넣습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ..
윈폼에서 다국어 처리 시 컨트롤에 자동으로 다국어를 바인딩시킬 수 있습니다. 연관글 영역 1. 개념 이해하기 자동으로 바인딩 되는 방식은 폼(Form) 단위로 관리됩니다. 'Language' 속성을 변경하면 자동으로 해당 언어-국가 코드에 맞게 '.resx'파일이 생성됩니다. 리소스(Resource)에서 다국어 처리할 때와 마찬가지로 '.resx'파일에 다국어 정보가 들어가게 되고, 설정된 현지화 정보에 따라 자동으로 처리됩니다. 2. 폼(Form)에 현지화(Localizable) 처리 폼의 속성에 'Localizable'를 'True'로 바꿔줍니다. 이때 'Language'는 기본값인 '(Default)'여야 합니다. 여기서 '(Default)'는 중립언어(혹은 기본언어, 이하 기본언어)라고도 합니다...
.NET에서 리소스(Resource)파일을 이용한 다국어 처리는 오래된 방식입니다. 간단하게 구현하는 방법을 알아봅시다. 연관글 영역 1. 리소스(Resource) 파일 만들기 이 프로젝트에서는 'Resource' 폴더에 파일을 만듭니다. 프로젝트에 어느 위치에 있어도 참조하는 데 문제는 없습니다. 추가 > 새 항목 > 리소스 파일(Resources File) 을 추가합니다. 기본 언어는 언어-국가 코드가 없는 파일명으로 만들어야 합니다. 나머지 추가된 언어들은 언어-국가 코드를 넣어 만듭니다. 이 프로젝트에서는 - LangStr.resx - LangStr.ko.resx 이렇게 생성했습니다. 2. 데이터 넣기 다국어로 사용할 언어 데이터를 넣어 줍니다. 'LangStr.resx'에는 기본언어인 영어를 넣..
예전에 비주얼 스튜디오에서 생성한 프로젝트는 빌드하면 자동으로 버전이 증가하는 기능이 있었습니다. 근데 이 기능이 어디로 사라진 거지??? 연관글 영역 1. 기능이 없어진 이유 결정적 버전 관리라를 개념이 적용되면서 자동증가기능이 제거되었습니다. 버전을 관리하는데 같은 버전은 빌드하든 뭘하든 같은 놈으로 취급한다.... 이런 개념입니다. (참고 : MSDN - 코드 생성을 제어하는 C# 컴파일러 옵션 : 결정적) 앵? 원래 그거 구분해서 썼던 거 아닌가????? 라고 하시는 분을 위해! 만약 전체변수 하나 수정해서 배포했다고 하면.. 기존 버전 사용자도 상관 그냥 써도 되고 새 버전 받은 사람도 상관없이 써도 된다면 굳이 판올림을 하지 않고 배포를 해도 됩니다. 이런 경우 자동증가를 켜두었다면 또 버전이..