반응형 분류 전체보기93 App.config의 useLegacyV2RuntimeActivationPolicy 역할과 적용 시나리오 다음 속성은 .NET Framework 4.x 프로세스에서, .NET 2.0/3.5(v2 CLR)용으로 빌드된 혼합 모드(C++/CLI) 어셈블리를 로드할 수 있게 해 주는 “레거시 활성화 정책” 스위치입니다. 핵심 역할기본 동작 변경: .NET 4부터는 혼합 모드(v2 대상) 어셈블리를 기본 설정만으로는 로드하지 않습니다.useLegacyV2RuntimeActivationPolicy="true"를 주면 v4 CLR이 기동되더라도 v2 CLR과의 공존/호환 경로를 열어 v2 타깃 혼합모드 DLL을 로드/활성화할 수 있습니다.해결 대상: 메시지“혼합 모드 어셈블리는 … ‘v2.0.50727’에 대해 빌드되며, 추가 구성 정보 없이 ‘4.0’ 런타임에 로드할 수 없습니다.”와 같은 Fil.. 2025. 10. 29. “싱글톤의 안전한 지연 생성: Lazy<T>는 락 없이 ‘처음 한 번만’ 만들어준다” 아주 좋은 질문이에요! 싱글톤에서 Lazy를 쓰는 건 “정말 필요해질 때까지 객체 생성을 미루고, 그 순간을 안전하게(스레드-세이프) 한 번만” 하려는 목적입니다. 꼭 써야만 하는 건 아니지만, 락/이중 체크 같은 보일러플레이트를 줄이고 예외/경합까지 깔끔히 처리해 주는 장점이 있어요. 아래 교재식으로 정리해 드릴게요. (가정: C# 12 / .NET 8)1) 왜 생겼는가 — “생성 시점을 늦추고, 동시에 단 한 번만”게으른 초기화(lazy init) 필요: 무거운 싱글톤을 처음 필요할 때 만들고 싶음.스레드 안전성: 여러 스레드가 동시에 접근해도 객체가 하나만 만들어져야 함.보일러플레이트 감소: lock + double-checked locking은 구현이 번거롭고 실수 여지가 있음 → 표준 구성요소로.. 2025. 10. 10. “C# readonly: 생성 후 불변을 보장해 버그를 줄이고 성능을 챙기는 설계 키워드” 좋은 질문이에요! C#의 readonly는 “한 번 정해진 값(또는 상태)을 바꾸지 않겠다”는 불변(immutability) 의도를 코드에 담아 주는 키워드예요. 쓰임새가 몇 가지(필드, 구조체, 멤버 등)로 나뉘어 헷갈리기 쉬우니 교재식으로 차근히 정리해 드릴게요. (가정: C# 12 / .NET 8)1) 왜 생겼는가 — “변하면 안 되는 건, 애초에 못 바꾸게”버그 예방: 실수로 값을 바꾸는 것을 컴파일 단계에서 차단합니다.가독성/의도 전달: “생성 후 불변”이라는 설계를 명확히 보여줍니다.최적화/성능: JIT가 읽기 전용임을 가정해 불필요한 방어적 복사(defensive copy)를 줄이거나 인라이닝에 유리합니다(특히 readonly struct, readonly members).2) 무엇인가 — .. 2025. 10. 10. “IDisposable: 가비지 컬렉터가 다 못하는 ‘자원 반납’을 결정적으로 보장하는 계약” 좋은 질문이에요! IDisposable을 구현(“상속”)하는 이유는 **“수명(lifetime)이 끝난 자원을 즉시·명시적으로 해제하기 위해서”**입니다. 가비지 컬렉터는 메모리만 자동으로 돌려주지만, 파일 핸들/소켓/데이터베이스 연결/윈도우 핸들 같은 비관리 자원은 누수가 생길 수 있거든요. 아래 구조로 정리해 볼게요. (가정: C# 12 / .NET 8)1) 왜 생겼는가 — “가비지 컬렉터만으로는 부족하다”GC 한계: .NET GC는 관리 힙 메모리만 회수합니다. OS 자원(파일, 소켓 등)은 GC 타이밍과 무관하게 즉시 닫아야 안전합니다.결정적 해제(Deterministic cleanup): IDisposable.Dispose()를 호출하면 그 즉시 자원을 반환할 수 있습니다. using/await.. 2025. 10. 10. C# “??는 ‘null이면 우변’ — 안전한 기본값 지정의 한 줄 공식” 좋은 질문이에요! 말씀하신 생성자에서의 ??는 **null 병합 연산자(null-coalescing operator)**입니다. 코드 조각을 기준으로 교재식으로 정리해 드릴게요.1) 왜 생겼는가 — “null이면 대체값을 쓰자”메서드 인자나 계산 결과가 null일 수도 있는 상황에서, 매번 if (x == null) ...를 쓰면 코드가 장황해집니다. 그래서 *“좌변이 null이면 우변을 대신 쓰자”*라는 패턴을 한 줄로 쓰기 위해 ??가 생겼습니다.2) 무엇인가 — left ?? right의 의미정의: left가 null이 아니면 left를, null이면 right를 반환합니다.평가 순서/성능: left를 먼저 평가하고, left가 null이 아닐 때는 right는 평가하지 않습니다(지연 평가).→ D.. 2025. 10. 10. “C# 값 형식에도 없음(null)을 — T? = Nullable<T> 제대로 쓰는 법” 1) 왜 생겼는가 — “값 형식도 값이 없을 수 있다”문제 배경: 기본값(Value type)은 원래 null을 가질 수 없어요. 예를 들어 int는 0, 1, -5 같은 “숫자”만 가능하고 “값 없음”을 표현할 방법이 없었습니다.필요성: DB의 NULL, 폼 입력의 미입력, 센서값 미수집 같은 “없음” 상태를 정확히 모델링해야 할 때가 많습니다.해결: T?(여기서 T는 값 형식) 를 도입해 null을 담을 수 있게 했습니다. 즉, int?, bool?, DateTime? 처럼 “값이거나(null이 아닐 때) 없다(null일 때)”를 표현합니다.2) 무엇인가 — T?는 사실 Nullable의 문법 설탕정의: T?는 값 형식 T에 대해 Nullable로 컴파일됩니다.구성: Nullable는HasValue .. 2025. 10. 10. error. 이벤트핸들러 이름 충돌 문제 원인은 이름 충돌이에요.당신이 만든 VIK.ImageGrabbedEventArgs (버퍼+카메라)와Basler SDK의 Basler.Pylon.ImageGrabbedEventArgs (GrabResult 포함)이 같은 이름이라, StreamGrabber.ImageGrabbed 구독 시 컴파일러가 잘못된 쪽을 참고하고 있어요. 그래서“EventHandler에 맞는 오버로드 없음”“DisposeGrabResultIfClone, GrabResult가 없음”같은 에러가 터집니다. (이 멤버들은 Basler 쪽에만 있어요.)빠른 해결: 형식 별칭 + 핸들러 이름 구분Basler 파일에서 형식 별칭을 추가하고, 이벤트 핸들러를 Basler 전용으로 분리하세요.1) using 별칭 추가 (파일 상단)using .. 2025. 9. 22. volatile는 멀티스레드에서 “가벼운 동기화”를 위한 읽기/쓰기 가시성 보장 장치 volatile는 멀티스레드에서 “가벼운 동기화”를 위한 읽기/쓰기 가시성 보장 장치라고 이해하면 편합니다.private volatile bool _isGrabbing = false;처럼 플래그에 쓰면, 다른 스레드가 값 변경을 즉시 보고 잘 멈추거나 시작할 수 있게 해줘요.volatile가 뭔가요?효과: 해당 필드에 대한 **읽기(Read)**와 **쓰기(Write)**가**CPU/컴파일러 재정렬(reordering)**로 서로 엇갈리지 않게 만들고,코어별 캐시/레지스터에만 머물다 안 보이는(stale) 값이 되는 일을 막아,다른 스레드에서 최신 값을 즉시 관측할 수 있게 합니다.(쉽게 말해: “바로 보이게 하고, 읽기/쓰기 순서를 뒤바꾸지 말라”는 메모리 장벽을 넣어줍니다. 읽기는 acquire, 쓰.. 2025. 9. 19. 왜 IDisposable을 구현하나요? 핵심 한 줄 요약**IDisposable = “내가 잡고 있는 외부 자원(파일 핸들, GDI, 스레드/Task/Timer 등)을 사용이 끝나면 즉시, 확정적으로 해제할 수 있게 해주는 계약(패턴)”**입니다.GC는 메모리만 회수하지 OS 자원(파일·소켓·GDI·스레드 핸들 등)은 즉시 정리하지 못하므로, 이런 자원을 가진 타입은 반드시 IDisposable을 구현해야 해요.왜 IDisposable을 구현하나요?결정적(Deterministic) 해제using (...) { ... } 블록이 끝나는 즉시 Dispose()가 호출되어 OS 핸들/타이머/스레드/그래픽 자원 등을 반납합니다.GC는 언제 실행될지 몰라요(비결정적). 파일 잠금·GDI 핸들 같은 건 지연 해제되면 곧바로 문제가 납니다.리소스 누수/잠.. 2025. 9. 19. “직접 델리게이트 콜백” → “.NET 표준 이벤트 패턴(Event + EventArgs)” 왜 바꿨나? (Delegate → Event + EventArgs)1) .NET 표준 이벤트 패턴에 맞춤.NET에서 이벤트는 관례적으로 event EventHandler 형태를 써요.이렇게 하면 구독/해제(+=, -=), 멀티캐스트(여러 핸들러 동시 호출), 외부에서 임의 호출 차단 같은 이벤트 전용 보호 장치가 자동으로 따라옵니다.반면, public OnImageGrabbedEventDelegate OnImageGrabbedCallback; 같은 일반 필드 델리게이트는외부에서 통째로 갈아끼우기가 가능(기존 구독이 날아갈 위험)외부 코드가 임의로 호출도 가능(캡슐화 약함)멀티 구독/해제 동작이 명확하지 않음2) 시그니처 표준화: object sender, TEventArgs e이벤트 핸들러는 통일된 모양.. 2025. 9. 19. 이전 1 2 3 4 ··· 10 다음 반응형