.NET General2007. 2. 6. 15:05
윈도우즈 서비스로 만든 닷넷 모듈에 문제가 생겨서 디버깅할 일이 있었다. 알다시피 윈도우 어플리케이션은 일반 닷넷 어플리케이션처럼 확장자는 exe이지만, 독립적으로는 실행되지 않고, 서비스에 등록되어서 실행되게 된다.

그래서 디버깅을 하기 위해서는 Visual Studio의 프로세스 디버깅 기능을 이용해야 한다. 즉 아래 그림처럼 서비스의 프로세스를 비주얼 스튜디오 디버깅 메뉴에서 직접 연결해서 디버깅하는 것이다.

사용자 삽입 이미지


그런데 오늘은 위 방법을 쓰기가 힘든 상황이 발생했다. 왜냐하면, 초기 작업에 문제가 있었던지 서비스 시작이 아예 되질 않는 거다..-_-;; 서비스 시작이 되질 않으니 프로세스를 디버깅할 수가 없는 문제가 발생했다.

결국 난감한 상황에서 언제나 한줄기 빛을 던져주시는(^^;;) 구글님에게 문의를 해보았고, 원하던 답을 찾을 수가 있었다. http://weblogs.asp.net/paulballard/archive/2005/07/12/419175.aspx 즉, 윈도우 서비스 초기화 코드에 아예 아래 코드처럼 디버깅을 시작할 수 있는 코드를 삽입하는 것이다.

<MTAThread()> _
Shared Sub Main()

#If DEBUG Then
        System.Diagnostics.Debugger.Launch()
#End If


이렇게 컴파일된 모듈을 서비스 MMC에서 시작시키면, 아래 그림처럼 디버깅 윈도우가 뜨고 비주얼 스튜디오를 이용해서 디버깅할 수가 있다.

사용자 삽입 이미지


내가 참조한 포스트의 저자는 Debugger.Break()을 사용해서 중단점을 걸면 된다고 말하고 있지만, 물론 컴파일할 때에 비주얼 스튜디오에서 중단점을 걸어놓는다면, 그것도 작동된다.
Posted by kkongchi
C# & VB.NET2006. 3. 25. 13:43
Split은 아주 많이 쓰이는 메소드 중에 하나이다. 대부분 "," 등의 Delimeter를 써서 여러 개의 데이터를 문자열로 이어 붙여서 DB에 넣어 두고는, 그걸 꺼내서 쓸 때 split 메소드를 사용해서 배열로 다시 쪼개서 사용하게 된다.

그런데, 아주 간혹 Delimeter가 한 글자가 아닐 때도 있을 수 있다. 복잡한 문장을 분석하고 싶을 때가 그런 경우가 된다. 또는 두 글자 이상의 문자열을 Delimeter로 써야 할 때도 있을 수 있다. (예를 들면 이미 각 문자열들에 "," 등의 character들이 포함되어 있어서 한 글자로 Delimeter를 쓰기가 애매한 경우가 있다.)

어제 나도 그런 경우가 생겨서 역시 Google의 도움을 받아서 어떤 사람이 만들어 놓은 함수를 하나 구했다.

원본은 여기 - http://community.sgdotnet.org/blogs/triplez/archive/2005/04/24/14627.aspx


C#

private string[] SplitByString(string testString, string split) {
  int offset = 0;
  int index = 0;
  int[] offsets = new int[testString.Length + 1]; 

  while(index < testString.Length) {
    int indexOf = testString.IndexOf(split, index);
    if ( indexOf != -1 )  {
       offsets[offset++] = indexOf;
       index = (indexOf + split.Length);
    } else {
       index = testString.Length;
    }
  }

  string[] final = new string[offset+1];
  if (offset == 0 ) {
    final[0] = testString;
  } else {
    offset--;
    final[0] = testString.Substring(0, offsets[0]);
    for(int i = 0; i < offset; i++) {
       final[i + 1] = testString.Substring(offsets[i] + split.Length, offsets[i+1] - offsets[i] - split.Length);
    }
    final[offset + 1] = testString.Substring(offsets[offset] + split.Length);
  }
  return final;
}


VB.NET

Function SplitByString(ByVal splitString As String, ByVal delimeter As String)
  Dim offset As Int16
  Dim index As Int16
  Dim offsets(splitString.Length) As Integer

  While index < splitString.Length
      Dim indexOf As Int16
      indexOf = splitString.IndexOf(delimeter, index)
      If indexOf <> -1 Then
          offsets(offset) = indexOf
          offset = offset + 1
          index = (indexOf + delimeter.Length)
      Else
          index = splitString.Length
      End If
  End While

  Dim final(offset) As String
  If offset = 0 Then
      final(0) = splitString
  Else
      offset = offset - 2
      final(0) = splitString.Substring(0, offsets(0))
      Dim i As Int16
      For i = 0 To offset
          final(i + 1) = splitString.Substring(offsets(i) + delimeter.Length, offsets(i + 1) - offsets(i) - delimeter.Length)
      Next
      final(offset + 2) = splitString.Substring(offsets(offset + 1) + delimeter.Length)
  End If

  Return final
End Function



원작자의 페이지에는 C# 으로 된 함수 뿐이지만, 필요했던 것이 VB.NET이어서 VB.NET으로 고쳤다. 그런데 VB.NET으로는 코딩해본 적이 거의 없어서, 일단 잘 실행되는 것 까지는 봤는데 어떤 버그가 있을지는 잘 모르겠다..^^;; 혹시 이 블로그 들르시는 VB.NET 고수 분들이 있다면 가르침을 좀 주시길....ㅎㅎ (배열 부분이 C#이랑 좀 달라서 애를 좀 먹었다)
Posted by kkongchi