“.NET” 태그의 글
“.NET” 태그가 붙은 글 48건을 최신순으로 정리했습니다.
-
Windows 앱의 작업 트레이 상주와 토스트 알림 ── NotifyIcon의 함정과 AppNotification 선택 기준
업무용 Windows 앱을 작업 트레이(알림 영역)에 상주시키고 토스트 알림으로 사용자에게 알리는 구현을 정리합니다. NotifyIcon의 올바른 사용법과 「닫으면 트레이로」설계, 탐색기 재시작 시 재등록, 토스트 API 3종(Windows App SDK AppNotificatio...
-
VB6 애플리케이션은 언제까지 동작할까 ── 런타임 지원 현황과 현실적인 .NET 이전 진행 방법
VB6 애플리케이션은 언제까지 동작할까요. VB6 런타임의 지원 정책(Windows 11도 지원 대상)과 IDE 지원은 이미 종료되었다는 비대칭적인 현황을 정리하고, 전면 재작성・자동 변환・단계적 이전의 판단표, 이전 전 자산 파악, VB6와 .NET의 비호환 지점, C#과 VB....
-
업무 앱의 일본 연호・공휴일・마감일 처리 ── 연호 개원에 강한 설계와 JapaneseCalendar・영업일 계산의 실무
장표에 「레이와 8년」을 표시하고, 공휴일을 제외한 영업일을 계산하며, 20일 마감 익월 말일 지급 ── 일본 업무 앱 특유의 날짜 처리에는 연호 개원, 공휴일의 법 개정, 월말의 반올림이라는 「나중에 바뀌는 사양」이 숨어 있습니다. 이 글에서는 JapaneseCalendar를 이...
-
WinForms/WPF 앱 다국어화 ── resx·새틀라이트 어셈블리·컬처 전환 실무
Windows 데스크톱 앱의 다국어화를 CurrentCulture와 CurrentUICulture의 차이, resx와 새틀라이트 어셈블리를 통한 리소스 구조, WinForms의 Localizable 속성, WPF에서의 현실적인 방식 선택, 실행 중 언어 전환, 레이아웃·서식·RTL...
-
CSV는 “그냥 텍스트”가 아니다 ── C# 업무 앱의 CSV 실무(문자 코드・Excel 호환・인젝션 대책)
업무 앱의 CSV 입출력에서 발생하는 전형적인 사고 패턴──Split(',')를 이용한 자체 파싱, BOM 없는 UTF-8의 Excel 문자 깨짐, 선행 0 소실, CSV 인젝션──을 정리하고, RFC 4180의 규칙, .NET에서의 Shift_JIS 처리(CodePagesEnco...
-
HttpClient를 using으로 감싸면 안 되는 이유 ── C# 업무 앱의 HTTP 통신 실무(생성 패턴・타임아웃・재시도)
C#의 HttpClient를 매번 using으로 생성하면 소켓 고갈이, static으로 만들면 DNS 변경을 따라가지 못하는 문제가 발생합니다──이 두 가지 큰 문제의 구조와, PooledConnectionLifetime・IHttpClientFactory를 이용한 올바른 생성 패턴...
-
PerfView와 dotnet-trace로 “느림”의 원인을 찾는다 ── .NET 성능 조사 실무 입문
업무 앱이 “느리다”, “CPU를 다 써버린다”, “가끔 멈춘다”고 할 때, 어떤 도구로 무엇을 봐야 할까요. PerfView와 dotnet-trace의 역할 분담, CPU 샘플링을 읽는 방법(inclusive/exclusive), ThreadTime을 이용한 블록 시간 조사, E...
-
Windows 이벤트 로그·ETW 입문 ── 업무 앱의 로그를 OS 표준 체계에 올리기
Windows 업무 앱의 로그를 파일 로그만으로 해결하고 있지는 않은가요? 이벤트 로그와 ETW는 운영 담당자나 OS 표준 도구에서 보이는 또 다른 계층의 기록입니다. 3가지 수단을 구분해서 쓰는 방법, .NET에서 기록하는 방법, EventSource를 이용한 ETW 계측, 수집...
-
appsettings.json만으로는 부족하다 ── Windows 업무 앱 구성 관리 실무(환경별 설정・비밀 정보・쓰기 위치)
Windows 업무 앱의 구성 관리를 appsettings.json의 계층화, IConfiguration과 IOptions/IOptionsSnapshot/IOptionsMonitor의 구분 사용, 환경별 설정, 쓰기 가능한 설정의 배치 위치, 비밀 정보 처리, 실행 중 설정 변경,...
-
Windows 업무 앱의 인쇄와 PDF 출력 - System.Drawing.Printing / WPF / 보고서 라이브러리 구분 사용법
PrintDocument를 이용한 WinForms 인쇄, WPF의 FlowDocument/FixedDocument 인쇄, PDF 출력의 선택지를 요구사항별 판단표로 정리합니다. 페이지 나눔 제어나 DPI 차이 같은 구현의 함정, Windows 서비스에서의 인쇄, 기본 프린터 의존의...
-
OSI 참조 모델을 확실하게 이미지화하기 ── HTTP 요청 1개를 7계층으로 해부한다
OSI 참조 모델을 암기가 아니라 실물로 이해합니다. HTTP GET 요청 1개를 운반하는 Ethernet 프레임을 C#으로 조립하고 해부해서, L2~L7이 바이트열로서 물리적으로 겹쳐져 있는 모습을 헥스 덤프와 Wireshark로 확인합니다. 각 계층과 .NET API(HttpC...
-
Windows의 세션 분리를 어떻게 이해할까 ── Session 0・RDP・다중 사용자 동시 실행
Windows 앱 개발자가 혼란스러워하기 쉬운 '세션' 개념을 정리합니다. 서비스가 UI를 표시할 수 없는 Session 0 분리의 이유, RDP 접속 시 세션의 동작, 명명된 개체의 세션 분리, 공유 PC・RDS 환경에서 흔히 발생하는 설계 실수까지 실무 관점에서 설명합니다.
-
WinDbg + SOS로 크래시 덤프 읽기 ── 수집 이후 실무 분석 입문
수집한 Windows 크래시 덤프를 WinDbg와 SOS 확장으로 실제로 읽는 절차를 설명합니다. 심볼 경로 설정, !clrstack・!pe・!dumpheap -stat・!gcroot로 예외와 메모리 누수를 추적하는 방법, 네이티브 크래시의 !analyze -v, dotnet-du...
-
Windows 앱의 중복 실행 방지 ── 네임드 Mutex와 재실행 시 창 활성화
업무용 Windows 앱의 정석 요건인 「같은 앱을 두 번 실행시키지 않는다」를 네임드 Mutex로 구현하는 방법을 정리합니다. Global\ 과 Local\ 네임스페이스의 차이로 인한 RDP 환경의 함정, 소유 스레드 제약과 AbandonedMutexException, SetFo...
-
C#에서 Win32 API를 안전하게 호출하기 — P/Invoke 실무 가이드(DllImport / LibraryImport / CsWin32)
C#에서 P/Invoke로 Win32 API나 네이티브 DLL을 호출할 때의 실무 포인트를 정리합니다. DllImport와 LibraryImport의 차이, CsWin32를 이용한 시그니처 자동 생성, 문자열 마샬링의 함정, SafeHandle을 이용한 핸들 관리, SetLastE...
-
WinForms/WPF 앱에 Entra ID 인증 넣기 ── MSAL.NET과 WAM 브로커 실무 구성
WinForms/WPF 데스크톱 앱에 Entra ID(구 Azure AD) 인증을 도입하는 절차를 실무 관점에서 정리합니다. 퍼블릭 클라이언트의 개념, ROPC 폐지 현황, 앱 등록, MSAL.NET의 AcquireTokenSilent 패턴, WAM 브로커, 토큰 캐시 영속화, 도...
-
업무 앱의 날짜/시간과 시간대 ── DateTime의 함정부터 UTC 저장 원칙, 테스트 설계까지
서버 이전 시 시간이 9시간 어긋나거나, 해외 지사에서만 날짜가 하루 전날이 되는 문제──날짜/시간 사고의 원인을 DateTime의 Kind와 암묵적 변환부터 정리합니다. DateTimeOffset과의 구분 사용, UTC 저장과 ISO 8601 원칙, TimeZoneInfo와 일광...
-
Windows 데스크톱 앱의 UI 자동 테스트 ── UI Automation의 원리와 FlaUI로 만드는 잘 깨지지 않는 테스트
WinForms/WPF 앱의 UI 자동 테스트를 Windows UI Automation의 원리(트리·AutomationId·컨트롤 패턴)부터 정리합니다. FlaUI를 이용한 최소 구현, WinAppDriver의 현재 상황, AutomationId 설계와 조건 대기로 잘 깨지지 않게...
-
WPF의 고DPI 대응 ── 「DPI에 강할 텐데」인데도 흐릿하고・번지는 원인과 대처
WPF는 DIP(1/96인치)로 레이아웃되어 처음부터 System DPI Aware이지만, DPI가 다른 모니터로 옮기면 전체가 번지고, 비트맵이나 단선은 흐릿해집니다. 원인 구분, .NET Framework 4.6.2/.NET에서의 Per-Monitor DPI 대응, UseLay...
-
C#의 Excel 조작에서 EXCEL.EXE가 남는 문제 ── COM 참조 해제 패턴과 교체 판단
C#에서 Microsoft.Office.Interop.Excel로 Excel을 조작하면 EXCEL.EXE 프로세스가 남는 문제를, COM 참조 카운트와 RCW의 원리로 정리합니다. 2닷 규칙의 함정, Marshal.ReleaseComObject파와 GC파의 해제 패턴, Hwnd로 ...
-
WinForms의 고DPI 대응 - 4K 모니터에서 흐려지거나 깨지는 원인과 현실적인 대처법
4K 모니터나 150% 스케일링 환경에서 WinForms 앱이 흐려지거나 레이아웃이 깨지는 원인을 DPI 가상화와 DPI 인식 모드(System Aware / Per-Monitor V2) 관점에서 정리합니다. .NET과 .NET Framework 각각의 설정 방법, AutoScal...
-
Windows의 프로세스 간 통신을 어떻게 선택할까 ── 네임드 파이프 / TCP / gRPC / 공유 메모리 / COM 판단표
Windows 앱 사이의 연동 수단을 어떻게 선택할지 정리합니다. 네임드 파이프, 로컬 TCP, gRPC, 공유 메모리, 파일 연동, COM 각각의 강점과 함정을 판단표로 정리하고, UI+서비스 분리・32bit/64bit 브리지・권한 경계 같은 정형 구성과 네임드 파이프 구현 예시...
-
C#에서 SQLite를 업무 앱에 쓰는 법 ── WAL 모드・배타 제어・손상 대책・EF Core와의 구분
Microsoft.Data.Sqlite로 SQLite를 업무용 Windows 앱에 통합하는 실무 지식을 정리합니다. 연결 문자열과 풀링, WAL 모드의 원리, SQLITE_BUSY와 쓰기 경로 단일화, 트랜잭션을 이용한 고속화, 타입 매핑의 함정, VACUUM INTO를 이용한 백...
-
Windows 서비스 만드는 방법과 운영 ── 태스크 스케줄러와의 구분 사용부터 BackgroundService의 서비스화까지
상주 처리를 Windows 서비스로 만들어야 할지, 태스크 스케줄러로 충분한지를 판단표로 정리하고, .NET Worker Service(UseWindowsService)를 이용한 서비스 제작 방법, 실행 계정・복구 옵션・이벤트 로그・안전한 정지 처리까지, 운영에 올리기 위한 설계를...
-
IE 모드 다음은 WebView2로 괜찮은가 ── ActiveX가 동작하지 않는 제약과 현실적인 마이그레이션 설계
WebView2의 기본 구조, Evergreen과 Fixed Version의 배포 전략, 사용자 데이터 폴더의 함정, 네이티브와 Web의 연동 방법, 그리고 「ActiveX는 동작하지 않는다」는 제약을 고려한 IE 모드 의존 시스템으로부터의 현실적인 마이그레이션 순서를 사내 시스템...
-
Windows 앱 데이터 저장 위치를 고르는 방법 ── SQLite / JSON / 레지스트리 / Access 판단표
Windows 데스크톱 앱의 데이터를 어디에·무엇으로 저장할지 정리합니다. AppData/ProgramData 구분, SQLite・JSON 파일・레지스트리・Access(.accdb) 각각의 강점과 함정을 판단표로 정리하고, 손상 대책과 비트 수 문제까지 실무 관점에서 설명합니다.
-
PDB(프로그램 데이터베이스)란 무엇인가 - 디버그 정보·심볼·Source Link 이해하기
PDB(Program Database / 프로그램 데이터베이스)란 무엇인지, 무엇이 들어 있고 무엇이 들어 있지 않은지, Debug / Release, Portable PDB, Source Link, 심볼 서버, 덤프 분석과의 관계까지 실무 관점에서 정리합니다.
-
Roslyn이란 무엇인가 ── 컴파일러의 시각으로 C# 코드를 읽고 고치고 생성하기
Roslyn(.NET Compiler Platform)의 개요, Syntax Tree, SemanticModel, Workspace, Analyzer, Source Generator, 실무에서의 활용처와 주의점을 정리합니다.
-
Windows 앱 외주·수탁 개발을 의뢰하기 전에 정리해야 할 것
Windows 앱의 외주·수탁 개발을 의뢰하기 전에, 기존 소프트웨어 개수, 장치 연계, COM/ActiveX, 배포·업데이트, 보수와 관련해 정리해야 할 포인트를 설명합니다.
-
.NET Framework / .NET에서 대수적 데이터 타입 사용하기 ── 상태와 결과를 타입으로 표현하는 설계
대수적 데이터 타입, 특히 합 타입(구별 합집합)을 .NET Framework와 .NET에서 사용하는 방법과 장점을 F#, C# 클래스 계층, record, OneOf, C# 15 union 프리뷰까지 포함해 정리합니다.
-
Windows 위장 토큰을 올바르게 다루기 - 스레드 단위 권한 대여와 안전한 복원 방법
Windows의 위장 토큰에 대해 액세스 토큰, 기본 토큰, 스레드 토큰, 위장 레벨, RevertToSelf, .NET의 WindowsIdentity.RunImpersonated까지, 실무에서 안전하게 다루기 위한 사고방식을 정리합니다.
-
TCP에서 Send한 단위대로 Receive할 수 있다는 오해 ── 바이트 스트림으로 다루기 위한 수신 설계
TCP 통신에서 Send나 Write한 단위대로 수신할 수 있다고 생각하면 분할·결합·문자 깨짐·프로토콜 손상이 발생합니다. TCP를 바이트 스트림으로 다루고 애플리케이션 쪽에서 프레이밍하는 사고방식과 .NET/C#에서의 구현 예를 정리합니다.
-
.NET에서 GC 대기와 메모리 누수를 구별하는 법 ── 늘어나는 메모리를 관측·비교·증명하는 실무 절차
.NET 애플리케이션에서 메모리가 증가하는 이유가 가비지 컬렉션 대기인지, 실제로 메모리 누수인지를 dotnet-counters, dotnet-gcdump, dotnet-dump로 가려내는 절차를 정리합니다.
-
C#(CSharp)에서 PowerShell을 실행하고 결과를 객체로 받는 방법
C#에서 PowerShell을 실행하고 결과를 문자열이 아닌 PSObject로 받는 방법을, PowerShell SDK, AddCommand, AddParameter, BaseObject, Properties, 오류 처리까지 실무 관점에서 정리합니다.
-
Windows는 왜 지금의 모습이 되었나: 개발자가 보는 역대 Windows의 진화
Windows 95부터 Windows 11까지의 변화를, 겉모습의 연표가 아니라 호환성, 안정성, 권한 관리, 드라이버, Win32, .NET, 보안 등 Windows 앱 개발자의 시점에서 정리합니다.
-
ClickOnce란 무엇인가 - 구조, 업데이트, 어울리는 장면・어울리지 않는 장면을 실무 시점에서 정리
ClickOnce가 무엇이고 매니페스트, 캐시, 업데이트, 서명이 어떻게 맞물려 동작하는지를 Mermaid 그림과 함께 정리하고, 사내용 .NET 데스크톱 앱 배포에서 어울리는 안건과 어울리지 않는 안건을 실무 시점에서 판단할 수 있도록 도와드립니다.
-
Windows 앱에서 자식 프로세스를 안전하게 다루기 위한 체크리스트 - Job Object, 종료 전파, 표준 입출력, watchdog의 베스트 프랙티스
Windows 앱이 자식 프로세스에 의존할 때, 기동 API보다 프로세스 트리의 소유권과 종료 절차의 설계가 안정성을 좌우합니다. Job Object로 수명을 묶고, 종료 전파를 분리하며, stdout/stderr를 비동기로 흘리고 watchdog을 별도 프로세스로 두는 베스트 프...
-
Windows에서 어디까지 싱글 바이너리로 만들 수 있는가 - 1 EXE로 가능한 범위, Windows 의존이 남는 곳, 배포 전 판단표
Windows 앱을 1 EXE로 만들고 싶을 때, 배포물을 합치는 것과 OS 의존을 없애는 것은 다릅니다. .NET single-file·Native AOT·정적 링크의 한계와 WebView2·WinUI·서비스·드라이버에 남는 의존을 판단표로 정리합니다.
-
시리얼 통신 앱의 함정 - 1 byte 단위, 타임아웃, 플로우 컨트롤, 재접속, USB 변환, UI 프리즈를 먼저 정리
시리얼 통신 앱이 가끔 멈추거나 응답이 어긋나는 진짜 원인은 byte stream의 메시지 경계, 타임아웃, 재접속, single writer 설계에 있습니다. 실무에서 무너지기 쉬운 함정과 먼저 정리할 체크리스트를 한 번에 정리했습니다.
-
.NET의 Generic Host란 무엇인가 - DI, 설정, 로그, BackgroundService를 먼저 정리
Generic Host의 정체를, DI・설정・로그・BackgroundService와 Host.CreateApplicationBuilder / WebApplicationBuilder의 관계로 정리합니다. 어디서 효과적이고 어디서 과잉인지를 .NET 6 이후의 실무 시점에서 짚습니다.
-
.NET의 Native AOT란 무엇인가 - JIT, ReadyToRun, trimming과의 차이를 먼저 정리
Native AOT가 publish 시점에 .NET 앱을 정적으로 굳히는 배포 모델임을 JIT, ReadyToRun, trimming, source generator와 비교해 정리하고, 어느 앱에 잘 맞고 어디서 막히는지 실무 관점에서 판별 기준을 잡습니다.
-
PeriodicTimer / System.Threading.Timer / DispatcherTimer의 사용 구분 - .NET의 정기 실행을 먼저 정리
PeriodicTimer는 async 루프, System.Threading.Timer는 ThreadPool callback, DispatcherTimer는 WPF UI 스레드라는 책무 차이를 정리하고, .NET 6 이후의 worker・WPF에서 망설이지 않도록 선택 기준을 제시합니다.
-
C#을 Native AOT로 네이티브 DLL로 만드는 방법 - UnmanagedCallersOnly로 C/C++에서 호출하기
.NET의 Native AOT와 UnmanagedCallersOnly로 C# 클래스 라이브러리를 네이티브 DLL로 발행해 C/C++에서 in-process로 호출하는 구성을, 핸들 기반 수명 관리와 에러 코드, C ABI 설계 요령으로 정리합니다.
-
Generic Host / BackgroundService를 데스크톱 앱에 가지고 들어오는 이유 - 기동・수명・graceful shutdown의 정리가 꽤 편해진다
WPF나 WinForms 같은 데스크톱 앱에서 Generic Host와 BackgroundService를 도입해 기동, 상주 처리, graceful shutdown, DI, 로그, 설정의 입구를 한 곳으로 모으는 설계 정리법과 안티패턴을 실무 시점으로 풀어냅니다.
-
ActiveX / OCX를 지금 어떻게 다룰 것인가 - 남길지・감쌀지・교체할지 판단표
ActiveX / OCX 자산을 만났을 때 무작정 폐기하지 말고, 그 부품이 무엇을 떠맡고 있는지를 기준으로 남길지・감쌀지・교체할지를 32bit / 64bit, 등록 방식, 브라우저 의존, 벤더 보수까지 함께 따져 판단하는 표를 정리합니다.
-
WPF / WinForms의 async/await와 UI 스레드를 한 장으로 정리 - await 후의 돌아갈 곳, Dispatcher, ConfigureAwait, .Result / .Wait()의 막힘 포인트
WPF/WinForms에서 async/await가 헷갈리는 핵심—await 후의 복귀 스레드, Dispatcher와 Invoke의 사용 구분, ConfigureAwait(false)의 진짜 의미, .Result/.Wait()로 화면이 굳는 이유까지 한 장으로 정리합니다.
-
FileSystemWatcher 사용법과 주의점 - 누락, 중복 알림, 완료 판정의 함정
Windows .NET 파일 감시에서 FileSystemWatcher의 이벤트를 완료 알림으로 오인하기 쉬운 함정과, 재스캔 요청·원자적 claim·idempotency를 축으로 누락과 중복을 견디는 안전한 설계 패턴을 정리합니다.
-
C# async/await의 베스트 프랙티스 - Task.Run과 ConfigureAwait의 판단표
C# async/await의 베스트 프랙티스를 I/O 대기와 CPU 계산의 구분, Task.Run·ConfigureAwait(false)·fire-and-forget·WhenAll·SemaphoreSlim·Channel의 형 선택 판단표로 정리합니다.