닷넷(.Net)에서 열거형(Enum)은 자체로도 클래스(Class)와 비슷한 역할을 수행합니다. 그런데 열거형의 문제는 열거형 멤버를 직접 다루려면 손이 많이 간다는 것입니다. 우리는 객체지향(Object-Oriented Programming, OOP)을 통해 이런 손이 많이 가는 작업은 클래스를 만들어 캡슐화하여 처리하라고 배웠습니다. 그러니 열거형을 클래스로 변환해 봅시다. (Enum to Class) 연관글 영역 1. 클래스 만들기 닷넷에서 열거형은 구성이 잘되어 있어 형 변환도 쉽습니다. 그러니 이러한 작업을 해주는 클래스를 만들면 됩니다! 1-1. 데이터 저장용 클래스 상황에 따라서 구조체(struct)를 사용해도 되지만 형 변환과정에서 무언가 더 필요할 수 있으니 모델로 만들어 줍니다. ///..
콘솔 응용프로그램을 만들 때 상황에 따라서 콘솔 창(Console Window)이 필요 없는 경우가 있습니다. 이런 경우 간단하게 창을 띄우지 않는 방법이 있습니다. 1. 간단한 방법 프로젝트 속성 > 응용 프로그램 > 출력 형식 에 보시면 콘솔 프로젝트의 경우 '콘솔 응용 프로그램'으로 설정되어 있습니다. 이것을 'Windows 응용 프로그램'으로 바꿔주면 명령 프롬프트 창이 띄지 않습니다. 단순히 콘솔 창만 가리고 싶다면 이 방법이 최고죠 ㅎㅎㅎ 하지만 비하인드 코드에서 아무런 제어를 할 수 없다는 단점이 있습니다. 2. 'WinAPI'를 이용한 방법 조금 번거롭더라도 'WinAPI'를 이용하면 코드에서 컨트롤이 가능합니다. 아래와 같이 'WinAPI'를 마샬링 해주고 [DllImport("kerne..
닷넷에서 클래스(Class)와 같은 오브젝트(object)를 바이트 배열(byte Array)로 만드는 건 좀 번거로운 작업이 필요합니다. 그런 번거로운 작업 중 재미있는 게 있어서 퍼왔습니다. 바로 'XML'을 이용하여 클래스를 바이트 배열로 만드는 것입니다. (참고 : code.about - HOW TO CONVERT FROM YOUR CLASS OBJECT TO BYTE[] AND VICE VERSA AND SEND IT THROUGH SOCKETS) 1. 기능 구현하기 일단 클래스를 만들어 봅시다. public class TestXML { public string Data1 { get; set; } public string Data2 { get; set; } public string Data3 {..
간만에 콘솔 프로그램을 만들다가 보니.......콘솔 프로그램은 종료 이벤트 처리를 어떻게 하지? 1. 이벤트 연결 콘솔 프로그램은 UI가 없기 때문에 이벤트를 직접 연결 해야 합니다. 해당 이벤트 이름은 'ProcessExit'입니다. (참고 : stackoverflow Gonzalo님 답변 - How to run code before program exit?) static void Main(string[] args) { AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit; } static void CurrentDomain_ProcessExit(object sender, EventArgs e) { throw new NotImplemente..
슈퍼소켓(SuperSocket)을 테스트 하다보니 예상하지 못한 문제가 몇 가지 있네요 ㅎㅎㅎㅎ 여러 문제 중 클라이언트에서는 데이터를 전송했는데 서버에서 반응이 없는 경우를 알아봅시다. 0. 문제의 확인 클라이언트에서 데이터를 보내 봅시다. 서버에서 접속되었다는 메시지가 잘 출력되는 것으로 보아 서버에 접속은 됐습니다. 그런데 메시지를 보내면(스크린 샷에서 '보내기'로 표시된 부분이 메시지를 보내는 부분입니다.) 서버에서 응답이 없습니다 ㅡ.ㅡ (정상적인 동작이라면 서버로 보낸 메시지가 그대로 돌아와야 합니다.) 그래서 기존에 만들었던 서버로 테스트해보니 클라이언트에서 데이터는 잘 넘어오고 있습니다. 1. 문제의 이유 이런 문제가 발생하는 것은 슈퍼소켓의 기본리시브필터가 아스키(ASCII)로 된 텔넷 ..
일반적으로 'DLL'은 개발단계에서 참조를 통해 연결하여 사용합니다. 하지만 여러 가지 상황에 따라서 동적 로드를 해야 하는 경우가 있죠. 대표적인 경우가 국가나 언어, 운영체제 등에 따라 다른 dll을 써야 하는 경우라던가 동적으로 생성된 'DLL'을 참조해야 하는 경우라던가... 물론 설계 의도에 따라 많이 달라지니 꼭 필요하다고는 볼 수 없습니다 ㅎㅎㅎ 어찌 됐건 동적으로 DLL을 로드하여 사용하는 방법을 알아봅시다. 1. 테스트 DLL 만들기 클래스 라이브러리로 프로젝트를 2개 생성합니다. 하나는 'TestDll1', 다른 하나는 'TestDll2'로 생성합니다. 각각의 코드는 아래와 같습니다. namespace TestDll1 { public class Class1 { public string ..
'OpenCV'를 사용하는 이유 중에 하나가 웹캠을 이용하기 위해서입니다. 다른 방법도 있습니다만 크로스플랫폼(Cross Platform)을 생각한다면 'OpenCV'를 빼고 가기 힘들죠 ㅎㅎ 'OpenCV'를 닷넷으로 랩핑한 'OpenCVSharp'을 이용하여 웹캠에서 이미지를 받아오겠습니다. 1. 프로젝트 생성 윈폼 프로젝트를 생성합니다. 이전 글을 참고하여 프로젝트에 DLL을 복사합니다. (참고 : [C#.Net, OpenCVSharp] 'opencvsharp'를 이용하여 C#에서 OpenCV 사용하기 - '2.설치하기' 참고) 1-1. 디자이너 폼에 픽처 박스 한 개와 타이머 하나를 추가합니다. pictureBox1 timer1 1-2. 코드 작성 코드는 이전 글과 비슷합니다. 단지 이미지를 불러..
WCF가 예전에 사용하던 방식과 달라 이것저것 테스트하다가 간만에 뜬 에러 크로스 스레드 작업이 잘못되었습니다. 아.... 예전에 WPF에서 한번 소개 하긴 했었습니다만 윈폼에서는 약간 다르죠. (참고 : [WPF] 다른 쓰레드에서 UI쓰레드 접근하기 - Dispatcher.Invoke) 연관글 영역 1. 일반적인 방법 일반적으로 인보크(Invoke)를 사용하려면 델리게이트(Delegate)를 만들어야 합니다. (참고 : MSDN - Control.Invoke 메서드) 일반적인 방법에서는 다음과 같은 순서로 인보크를 사용합니다. 1) 델리게이트 선언 2) 델리게이트에 연결할 함수 생성 3) 델리게이트와 생성한 함수 연결 4) 인보크로 델리게이트 호출 //1) 델리게이트 선언 /// /// 델리게이트 선언..
마이크로 소프트나 다른 회사에서 만든 컴포넌트들을 쓰다 보면 흔히 격는 일 중에 하나가 제공되지 않는 기능이 필요할 때입니다. 보통은 해당 클래스를 상속받는 클래스를 만들거나 별도의 클래스를 만든 후 그 클래스 안에 기존 클래스를 생성하고 새로 만든 클래스에 기능을 추가 하는 방법도 있습니다. 그런데 일관성을 높이려면 A클래스에 속한 기능을 B클래스를 선언해서 사용하는 건 그리 좋은 방법이 아닙니다. 기존에 A클래스를 참조하고 있는 모든 기능을 B클래스로 옮겨야 하기 때문이죠. (안 그러면 어떤 건 A를 참조하고 어떤 건 B를 참조하는 불상사를 많이 보게 됩니다-_-;) 이럴 때 사용하는 것이 확장 메서드(Extension Methods) 입니다. 이름 그대로 남이 만들어 놓은 객체에 내가 원하는 기능을..
클래스 라이브러리에서 리소스 사용하는 게 뭐 힘들다고 이런 포스팅까지 하느냐? 하시는 분이 있을 듯 합니다. 맞습니다. 쉬워요. 문제는 임의로 만든 리소스 파일을 사용할 때 발생합니다. 1. 정상적인 경우 정상적인 경우 그냥 리소스 파일을 생성하고 사용하시면 됩니다. 다른 프로젝트에서 참조하려면 액세스 한정자만 'public'로 바꿔주면 됩니다. 멀티랭귀지를 사용할 때도 똑같이 액세스 한정자만 public으로 바꾸시면 됩니다. (참고 : [.Net] 다국어(멀티랭귀지, Multilanguage) 구현) 2. 정상적이지 않은 경우 그런데 비주얼 스튜디오 버그인지 '액세스 한정자' 메뉴가 활성화되지 않는 경우가 있습니다. 저 같은 경우 다른 프로젝트에서 만든 리소스를 옮겼더니 이런 현상이 있었습니다. 이런 ..