[c#] Contol.Invoke와 Control.BeginInvoke의 비교

Invoke와 BeginInvoke는 멀티 뜨레드를 다룰 때 자주 쓴다. Invoke는 Control로 제어권이 넘어간 뒤 돌아올 때를 기다리고 BeginInvoke는 기다리지 않는다. 조금 더 어렵게 설명하면 전자는 synchronous 즉 동기적이고 후자는 asynchronous 즉 비동기적이다. 아래 예제에서 BeginInvoke를 한 거는 label 출력 명령을 떠나 보낸 뒤 바로 제 갈 길을 간다. 따라서 BeginInvoke가 실행된 뒤 그 끝을 기다리지 않고…

[c#] 경로가 맞는데도 LoadLibrary가 126을 반환하고 실행되지 않는 문제

아래의 코드는 0을 반환해야 하지만 126을 반환하는 경우도 있다. LoadLibrary가 파일을 찾지 못하면 GetLastWin32Error는 126을 반환한다. 그러나 File.Exists(path)로 확인을 한 상태이므로 126을 반환해서는 안 된다. 이 문제에 대해 검색을 해 보면 dependency가 어쩌구 하며 여러 설명들이 나오지만 내가 보기엔 그저 버그다. 같은 코드가 어떤 컴퓨터에서는 0을 반환하고 다른 거에서는 126을 반환하기도 하며 후자의 경우에도 정적으로…

LoadLibrary 오류 처리 방법

LoadLibrary에 대한 자세한 설명은 따로 했다. LoadLibrary는 제대로 작동하지 않으면 그 이유를 정수 형태의 에러 메시지로 반환한다. 그러나 이러한 반환을 위해서는 아래와 같이 DllImportAttribute.SetLastError를 true로 설정해야 한다. 로드가 되지 않으면 Marshal.GetLastWin32Error 메떠드를 이용하여 아래와 같이 원인을 확인한다. GetLastWin32Error는 LoadLibrary를 실행한 바로 뒤에 실행해야 하는 거에 유의한다. 아래의 코드는 제대로 작동하지 않아 0을 반환한다. 그 이유는…

프로그램 코드로 웹패이지가 열리지 않는 경우 – user agent header

웹 브라우저로는 잘 열리는 url이 아래와 같은 코드로는 열리지 않는 경우가 있다. 서버가 http의 user agent header를 요구하기 때문이다. HTTP headers let the client and the server pass additional information with a message in a request or response.– HTTP headers, mdn web docs agent는 어려운 단어다. 흔히 대리인이라 번역하지만 computer와 관련되어서는 그렇지 않다. (computing) In…

[c#] 동적으로 c++ 라이브러리 이용하기

dll 파일의 형태로 제공되는 c++ 라이브러리는 보통 정적으로 로드하여 이용하지만 동적으로 할 수도 있다. 예를 들어 라이브러리에 쿼리하는 메떠드가 있는데 10분에 100번 이렇게 이용 횟수 제한이 있을 수 있다. 이 대이터가 서버 아닌 클라이언트에 저장된다면 동적으로 로드되어 있는 라이브러리를 언로드한 뒤 다시 로드하면 이런 제한을 초기화하여 피할 수 있다. 동적으로 라이브러리를 이용하려면 윈도우즈가 제공하는 세…

비주얼 스투디오 번거로운 경고 없애기

최근 버전의 비주얼 스투디오를 이용하다 보면 예전엔 없던 경고들이 뜬다. 널러블 변수에 대한 것들로 cs8601과 cs8604다. 여간 번거로운 것들이 아닌데 쓸모는 거의 없다. 저런 경고들은 코드로 없앨 수 있지만 귀찮고 코드를 난잡하게 만든다. 아예 뜨지 않게 설정을 할 수 있다. 이미 1701;1702가 입력되어 있는 걸 볼 수 있다. 여기에 숫자만 더하면 된다. cs6204는 그냥 6204로.

[c#] ToolStripMenuItem의 왼쪽 여백 없애기

.네트의 ToolStripMenuItem은 text 왼쪽에 아이콘이 출력되는 공간을 갖는다. 많은 경우 메뉴 아이템에 아이콘을 넣지 않는다. 이러면 텍스트 왼쪽에 애먼 공간만 덩그러니 놓인다. 이걸 없애려면 아래와 같이 한다.

LinkedList를 써야 할 때

LinkedList를 공부하면서 이게 배열이나 List와 어떻게 다른가는 복잡하게 익히지만 정작 이걸 언제 쓰는 게 좋은지에 대해서는 모르는 사람들이 많다. LinkedList는 이터래이트를 하면서 컬렉션의 아이템을 추가하고 없앨 때 제격이다. 배열이나 List로는 이를 제대로 구현할 수 없다. 아래는 정수로 이뤄진 컬렉션에서 홀수들을 찾아 없애는 c# 예제다. 여느 컬렉션들의 item을 LinkedList에서는 node라 한다. 노드는 next라는 프라퍼티를 갖기 때문에…

[c#] 문자열 리스트 출력하기 – ListBox, ListView, DataGridView 선택

예를 들어 조건을 만족하는 주식 종목들의 이름을 리스트의 형태로 출력하는 경우를 생각해 본다. 이름들을 한꺼번에 출력할 수 있고 가격 등이 변하여 조건을 만족하면 추가하여 출력할 수도 있다. 이들 가운데에 일부는 글꼴의 형태를 굵게 하거나 색을 바꿀 수 있으며 순서를 바꿀 수도 있다. 이런 기능들을 위해서는 어떤 비주얼 오브젝트를 쓰는 게 좋을까? 문자열을 리스트의 형태로 출력할…