모델에 FK(foreign key)를 연결하려고 상호 참조를 했더니 다음과 같은 에러가 납니다. Exception: Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property '[모델명]' with type '[네임스페이스]'. Path '[에러나 개체]'. at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer, Object value, JsonProperty property, JsonContract contract, JsonContainerContract container..
'JsonIgnore'속성은 JSON으로 출력할 때 무시하게 해주는 속성입니다. 해당 속성으로 지정되어 있으면 JSON으로 출력할 때 해당 필드가 없어야 합니다. 그런데 이 속성이 제대로 적용이 될 때가 있고 안될 때가 있는 겁니다...????? 1. 원인을 찾아서~ 원인은 의외로 간단한데...... 'JsonIgnore'은 두 군데에 선언이 되어 있습니다. System.Text.Json.Serialization Newtonsoft.Json 만약 자신이 'System.Text.Json.Serialization'를 사용 중인데 'Newtonsoft.Json.JsonIgnore'를 사용한다거나 반대로 ''Newtonsoft.Json'을 사용 중인데 'System.Text.Json.Serialization'를..
.NET 4.x에서 'SocketAsyncEventArgs'를 쓰다가 그대로 .NET 5로 업그레이드하면 'Completed'이벤트가 오지 않는 현상이 있습니다. (참고 : github - DGSocketAssist/DGSocketAssist1/) 아래 스크린 샷은 .NET 4에서 만든 'SocketAsyncEventArgs'를 .NET 5에서 사용한 경우입니다. 'SaeaSend_Completed'이벤트가 오지 않은 걸 확인할 수 있습니다. 아래 스크린 샷은 .NET 4에서 정상 작동한 경우입니다. 이것은 .NET 5부터 'ReceiveAsync', 'SendAsync'가 동기로 동작하기 때문입니다. 이 포스팅은 'ReceiveAsync'을 기준으로 설명합니다. ('SendAsync'도 똑같기 때문) ..
닷넷은 사운드 처리가 개떡 같습니다. '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] 버전 자동 증가(변경) 기능 켜기 ) 버전 정보에 와일드카드를 사용할 수 있습니다..