닷넷은 사운드 처리가 개떡 같습니다. 'SoundPlayer'는 멀티플랫폼에서 동작하지 않습니다. 이 꼬라지인 이유를 아직도 모르겠습니다... (최소한 기본 구현은 있어야 하는 게 아닌지....) 특히 크로스 플랫폼 작업 시 선택지가 애매해지는데...... 그나마 쓸 수 있는 가벼운 라이브러리인 'NetCoreAudio'를 소개합니다. 1. 'NetCoreAudio' 특징 이 라이브러리는 여러 플랫폼에 사용할 수 있습니다. 단점은 기본 사운드 API인 'SoundPlayer'처럼 한 번에 하나뿐이 재생을 못 합니다. 자세한 분석은 '3. 분석'에서 하겠습니다. 2. 설치 및 사용 누겟(NuGet)에서 'NetCoreAudio'를 찾아 설치해 줍니다. 간단한 예제 기본 예제는 잘되어 있습니다. 참고 : g..
'System.InvalidOperationException'에러는 이미 'SocketAsyncEventArgs'개체가 사용 중인 경우 발생합니다. 1. 원인 분석 이 라이브러리로 만든 프로그램이 몇 개인데 이런 에러가 있었다고?? 라는 생각을 하며 클라이언트의 상세 로그를 봤더니..... 강조된 로그가 3줄인데 첫 줄과 마지막 줄은 각각 다른 요청입니다. 첫 번째 줄은 주기적으로 서버에 보내는 내용이고 세 번째 줄은 사람이 직접 서버에 요청하는 내용입니다.... 우연의 결과로 밀리초까지 일치해버린것입니다!!!!!! 같은 증상으로 죽어버린 다른 클라이언트의 로그도 동일합니다. (아래 로그) 동시에 하나의 'SocketAsyncEventArgs' 개체를 사용하여 보내기(Send)를 하려고 해서 발생한 오류..
.NET에서 별다른 옵션 없이 출력하면 파일이 여러 개가 생성됩니다. 참조가 많다면 더 많은 파일이 생성되죠. 단일 파일로 배포하는 방법을 알아봅시다. * 이 기능은 '.NET Core 3.0' 이상 버전에서만 사용할 수 있습니다. * 1. 게시 .NET에 있는 '게시' 기능이 있습니다. 이 기능을 이용하여 편하게 배포할 수 있죠. 프로젝트에서 오른쪽 클릭 > 게시 파일로 출력하면 릴리즈(Release) 폴더의 내용과 거의 같습니다. 그러니 파일로 배포하려는 경우 릴리즈 폴더만 압축해서 배포해도 상관없습니다. 2. 단일 파일 생성 파일로 배포하면 압축해서 하나의 파일만 배포해도 되니 신경을 안 쓰고 있었는데.... 아무래도 파일이 많다 보니 컴퓨터에 익숙하지 않은 사람들은 1) 실행파일을 찾지 못하거나 ..
1. 오류 발견 지정된 파일을 찾을 수 없다는 에러가 나는데 수동으로 파일을 읽어도 잘 읽어지고, 'File.ReadAllText'를 써도 잘 읽어집니다. 웃긴 건 이걸 DLL로 만들어 쓰고 있었는데 원본 테스트에서는 아무런 문제가 없고, 에러 나는 타이밍은 파일을 읽을 때가 아니고 경로를 전달할 때입니다??? System.IO.FileNotFoundException: Could not load file or assembly 'Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'. 지정된 파일을 찾을 수 없습니다. File name: 'Newtonsoft.Json, Version=13.0.0.0, Cultu..
다른 포스팅에서 한번 다룬 내용이지만 그 포스팅은 종합적인 내용이라 검색하기 좋게 분리한 내용입니다. 연관글 영역 1. 증상 콘솔 애플리케이션(console application)에서 'F11'을 누르면 전체화면으로 전환됩니다. 이렇게 되면 키 이벤트로 'F11'을 받을 수 없게 됩니다. 2. 해결 'WinAPI'를 이용하여 '시스템 입력'을 꺼주면 됩니다. '시스템 입력'을 끄게 되면 'Ctrl + C' 같은 시스템 단축키도 동작하지 않습니다. 'WinAPI'를 사용하려면 1) 애플리케이션의 핸들을 가지고 와서 2) 콘솔 모드를 읽은 후 3) 읽은 모드를 변경하고 4) 변경된 콘솔 모드를 적용 하면 됩니다. 2-1. 사용할 함수 마샬링 필요한 함수는 GetStdHandle : 애플리케이션의 핸들을 가지..
다른 포스팅에서 한번 다룬 내용이지만 그 포스팅은 종합적인 내용이라 검색하기 좋게 분리한 내용입니다. 연관글 영역 1. 증상 콘솔 애플리케이션(console application)에서 콘솔 창을 클릭하거나 드래그하면 응용프로그램이 멈추는 현상 있습니다. 이것은 '빠른 편집 모드(Quick Edit Mode)'가 활성화 되어 있기 때문입니다. 2. 해결 'WinAPI'를 이용하여 '빠른 편집 모드'를 꺼주면 됩니다. 'WinAPI'를 사용하려면 1) 애플리케이션의 핸들을 가지고 와서 2) 콘솔 모드를 읽은 후 3) 읽은 모드를 변경하고 4) 변경된 콘솔 모드를 적용 하면 됩니다. 2-1. 사용할 함수 마샬링 필요한 함수는 GetStdHandle : 애플리케이션의 핸들을 가지고 오는 함수 GetConsole..
닷넷 5 이후 버전(기억이 맞나....) 부터는 버전 관리 인터페이스가 바뀌었습니다. 간단하게 '버전 자동 증가' 설정 방법을 다루고 이 정보를 시간으로 치환해보겠습니다. 연관글 영역 1. '버전 자동 증가' 설정하기 이전 버전에서는 프로젝트를 생성하면 'AssemblyInfo.cs'파일이 생성되고 빌드할 때 합쳐졌습니다. 이제는 프로젝트 파일(.csproj)에 정보가 기록되어 있다가 빌드할 때 'AssemblyInfo.cs'파일이 생성됩니다. 그래서 직접 'AssemblyInfo.cs'를 수정하면 안 됩니다. 1-1. 버전에 와일드카드(wildcard) 사용하기 예전 포스팅에서도 다뤘던 내용입니다. (참고 : [.NET] 버전 자동 증가(변경) 기능 켜기 ) 버전 정보에 와일드카드를 사용할 수 있습니다..
당연히 참(true)입니다만..... 왜 이 당연한 질문을 하는 걸까요? 인터넷을 돌아다니다 보면 빈문자열("")대신 'string.Empty'라는 녀석을 쓰라는 말을 많이 볼 수 있습니다. 이 질문의 답을 이해하려면 .NET에서 문자열이 어떻게 살아가고 있는지 알아야 합니다. 1. 문자열의 구현 대부분의 언어가 'string'형을 구현할 때 내부에서는 'char'배열로 구현합니다. 그래서 아래와 같이 배열로 접근 가능하죠. (언어마다 접근방법이 다를 수 있습니다.) 문자열은 참조 형식 변수? 값 형식 변수? 변수의 형식에는 크게 2가지 가 있습니다. - 참조 형식 (참고 : MS Docs - 값 형식(C# 참조) ) 그때그때 메모리에 할당되고 값을 전달할 때는 복사되어 원본이 보존됩니다. - 값 형식 ..
닷넷에서 응용프로그램을 종료할 때 사용하는 명령은 크게 3가지입니다. Application.Exit() Environment.Exit(0) System.Diagnostics.Process.GetCurrentProcess().Kill(); 이 포스팅에서는 이 3가지의 차이점을 알아봅니다. 샘플을 실행해보고 보면서 확인하면 더 이해하기 쉽습니다. 샘플 : github - dang-gun/DotNetSamples/ExitTest/ 연관글 영역 1. Application.Exit() 내부에 종료를 알리고 모든 메소드가 끝나면 종료됩니다. 참고 : MS Docs - Application.Exit 메서드 설명이 복잡하지만..... 간단하게 말하면 애플리케이션에 정상종료를 요청한다는 의미입니다. 그래서 모든 종료 관..
'throw'로 예외처를 할 때 'throw'와 'throw ex'가 있습니다. 특수한 경우가 아니라면 'throw ex'를 쓸 일이 없으므로 크게 중요한 내용은 아니지만, 알아두면 좋지 않겠습니까? ㅎㅎㅎ 1. 'throw' 와 'throw ex'의 차이 이 두 개의 차이는 'try~catch'가 중첩 되었을 때 즉, 에러처리를 중첩했을때 표시되는 위치가 차이 납니다. 'throw'는 여러 개가 중첩되더라고 실제 에러 난 위치부터 표시되고 'throw ex'는 'throw ex'를 호출한 위치부터 표시가 됩니다. 2. 테스트해 보기 다양한 테스트 코드가 인터넷에 많습니다. 제가 사용한 코드는 아래와 같습니다. 참고 : stackoberflow - Is there a difference between "..