본문 바로가기

전체 글302

MAUI TabbedPage와 Shell 사용 비교 특별한 이유가 없다면 최신 .NET MAUI 앱에서는 Shell을 사용하는 것이 더 좋은 선택이며 최신 트렌드에 부합합니다.이전 대화에서 겪으셨던 DI(의존성 주입) 문제도 Shell을 사용하면 훨씬 간단하게 해결됩니다. 왜 Shell이 더 권장되는지, 두 방식의 차이점은 무엇인지 자세히 설명해 드릴게요.Shell vs. TabbedPage 비교 특징 Shell TabbedPage 구조앱 전체의 상위 구조(Flyout, 탭, 내비게이션)를 한번에 정의. "All-in-one"단순히 여러 페이지를 탭으로 묶어주는 컨테이너 역할내비게이션URI 기반 (//main/status)으로 동작하여 유연하고 강력함. ViewModel에서도 쉽게 페이지 이동 가능.객체 인스턴스 기반 (Navigation.PushAs.. 2025. 10. 16.
MAUI BTLE InTheHand Client Sample. part2 Sample 코드 테스트 한 결과 Connect 이후에 Disconnect를 하고 다시 Connect를 하면 연결이 되지 않고 아래와 같은 예외가 발생했다.{"Cannot access a disposed object."} 발생 원인을 확인한 결과 아래와 같은 이유가 있었다.이 문제는 일반적으로 한 번 연결이 해제된 블루투스 장치 객체(Object)를 다시 사용하려고 할 때 발생합니다.InTheHand.Bluetooth 라이브러리에서는 Gatt.Disconnect()가 호출되면 내부적으로 장치 객체의 일부 리소스가 해제(Dispose)됩니다. 따라서 동일한 객체로 다시 연결을 시도하면 이미 해제된 리소스에 접근하게 되어 예외가 발생하는 것입니다.원인 설명최초 연결: DeviceListViewModel의 T.. 2025. 10. 16.
MAUI BTLE InTheHand Client Sample Code https://github.com/inthehand/32feet GitHub - inthehand/32feet: Personal Area Networking for .NET. Open source and professionally supportedPersonal Area Networking for .NET. Open source and professionally supported - inthehand/32feetgithub.comInTheHand 라이브러리 특징API 스타일: IObservable 대신 표준 async/await와 이벤트 핸들러(+=, -=)를 사용합니다. 이는 많은 C# 개발자에게 더 친숙할 수 있습니다.스캔 방식: DiscoverDevices()는 호출 시점에 발견된 장치 목록을 동기.. 2025. 10. 14.
MAUI BTLE Shiny Client Sample Code MAUI로 BluetoothLE 기기를 Scan 하고 통신을 하기 위해서 몇가지 라이브러기가 존재한다.초기에는 Plugin.BLE로 개발을 했다.그런데 Scan을 하고 Connect 후에 Data를 보내고 받을 때 너무 오래 걸리는 것이다. 3~5초까지 지연이 발생했다.해결을 해보려고 검색과 AI에 질문도 해봤지만 Plugin.BLE 라이브러리로는 해결책이 없는 것으로 결론지었다.그래서 알아본 것이 Shiny.NET이다. 라이브러리를 교체하지 않고 속도를 개선하는 방법에는 아래와 같이 제안을 받았다.개선 방법 요약 및 추천 순서방법장점단점/주의사항구현 난이도Write Without Response / Notification속도 향상 효과 가장 큼 (필수)데이터 유실 가능성 (별도 검증 로직 필요)중MTU.. 2025. 10. 14.
Visual Studio Code 개발 편의성 Font 설정 1. Visual Studio Code의 화면 메뉴 등의 Font 크기를 조절하는 방법- Setting- 검색창에서 Zoom 입력 - User - Window: Zoom Level 의 값을 변경해서 원하는 크기 설정 2. Editor Font 설정- Settings - Text Editor - Font- Font Family로 원하는 폰트 지정- Font Size로 크기 변경 2025. 9. 19.
C# float string format 전체 길이와 소수점 자리수 제어 C#에서 float 또는 double 값을 문자열로 포맷할 때, 전체 길이와 소수점 이하 자리수를 제어하는 방법은 ToString() 또는 String.Format()을 활용하는 것이 일반적이에요. 아래에 다양한 포맷 옵션을 정리해드릴게요. 😊🎯 소수점 자리수 지정: "F" 포맷csharpfloat value = 123.45678f;string formatted = value.ToString("F2"); // 결과: "123.46""F2"는 소수점 이하 2자리까지 표시.반올림 처리됨.💰 숫자 전체 길이 + 소수점: "N" 포맷csharpfloat value = 12345.6789f;string formatted = value.ToString("N3"); // 결과: "12,345.679""N3"는 .. 2025. 7. 28.
C#에서 DllImport를 사용해서 C++ DLL 함수를 호출할 때 진입점 못찾는 문제 관련 dumpbin 사용법 System.EntryPointNotFoundException 예외는 C#에서 DllImport로 호출하려는 함수의 "진입점(entry point)"—즉, DLL 안에 해당 함수 이름으로 내보낸(exported) 심볼이 존재하지 않을 때 발생합니다. 이건 네이티브 DLL과 C# 선언이 정확히 일치하지 않을 경우 흔히 생기는 오류예요. 🔍 원인 분석: 왜 진입점을 못 찾을까?원인설명❌ DLL에 함수가 Export되지 않음__declspec(dllexport) 없이 빌드됐거나, MFC 함수가 자체적으로 숨겨져 있음🧨 함수 이름이 맹글링(mangling) 됨C++에서는 함수 이름에 인자 정보가 포함되어 이름이 변경됨 (C#에서는 찾지 못함)🔀 함수 이름을 잘못 썼음DllImport에서 함수 이름 오타 또.. 2025. 7. 21.
QT v4.x QElapsedTimer 경과 시간 측정 방법 QElapsedTimer는 Qt 4.7부터 도입된 클래스로, 두 이벤트 사이의 경과 시간을 빠르게 측정할 수 있도록 설계되었습니다. QTime과 유사한 API를 제공하지만, 가능한 경우 단조(monotonic) 시계를 사용한다는 점에서 더 정확하고 안정적인 시간 측정이 가능합니다.주요 특징빠른 시간 측정: 밀리초 단위로 경과 시간을 측정할 수 있습니다.단조 시계 사용: 시스템 시간이 변경되어도(예: 사용자 수동 조정) 영향을 받지 않습니다.사람이 읽을 수 있는 시간으로 변환 불가: QElapsedTimer는 디버깅이나 성능 측정용으로 적합하며, 시각 표시에는 적합하지 않습니다.QElapsedTimer timer;timer.start();// 시간 소모가 큰 작업slowOperation();qDebug().. 2025. 6. 30.
QT v4.x 기반 TcpClient 예제 다음은 Qt 4.x 환경에서 동작하는 QTcpSocket 기반의 간단한 TCP 클라이언트 예제입니다. 앞서 제공한 서버 코드와 통신할 수 있도록 구성되어 있어요:#include #include #include class TcpClient : public QObject { Q_OBJECTpublic: TcpClient(QObject *parent = 0) : QObject(parent) { socket = new QTcpSocket(this); connect(socket, SIGNAL(connected()), this, SLOT(onConnected())); connect(socket, SIGNAL(readyRead()), this, SLOT(onReadyR.. 2025. 6. 30.