'c#'에 해당되는 글 27건

  1. 2008.02.12 .Net 자동 문서화 SandCastle, GhostDoc 2
  2. 2008.02.02 시스템 / 프로세스 메모리 구하기
  3. 2008.01.17 C# 에서 Win32 함수 쓰기.. C# C++ 자료형 비교
  4. 2008.01.17 C# Dll Load 1
  5. 2008.01.16 C# 데이터 베이스 개념
  6. 2008.01.16 시리얼 통신 자료 받기 메세지 Serial Port DataReceived Event
  7. 2008.01.16 크로스 스레드, 방법: 스레드로부터 안전한 방식으로 Windows Forms 컨트롤 호출

.Net 자동 문서화 SandCastle, GhostDoc

Program/Info Etc 2008. 2. 12. 11:34
이하 내용에 대한 문서를 복사 , 링크 하실경우에 댓글을 남겨주세요 ^^*

닷넷 자동 문서화에 대해 알아보던중 SandCastle, GhostDoc 를 발견했네요..

Tool 들의 설치

환경 : vs2008, vista

SandCastle : Xml 태그를 Help 파일로 변환해 주는 툴, MS 에서 지원하고 MSDN 이 이를 이용하여 제작되었다고 합니다
홈페이지 : http://www.codeplex.com/Sandcastle
컴파일러 다운로드 : http://www.codeplex.com/Sandcastle/Release/ProjectReleases.aspx?ReleaseId=9921
Gui 빌더 다운로드 : http://www.codeplex.com/SHFB/Release/ProjectReleases.aspx?ReleaseId=9848
SandCastle, Sandcastle Help File Builder Installer 라는 파일만 다운로드 하시면 될듯..

GhostDoc : Xml 태그 주석을 입력하는 툴
vs 2008 버젼 다운로드 : http://www.roland-weigelt.de/ghostdoc/

SandCastle 컴파일러와 gui 버젼을 다운로드 한후 설치.. GhostDoc 를 설치합니다.
SandCastle 버젼 :  Sandcastle January 2008 Release
SandCastle GUI 버젼 : 1.6.0.4 Production
GhostDoc 버젼 : GhostDoc Version 2.1.3 for Visual Studio 2008

GhostDoc 를 설치하니 VS2008을 실행 단계에서 단축키 설정을 할 수 있도록 되어있군요..
단축키를 설치하여도 되고.. 안하여도 VS2008 팝업 메뉴에 XML 태그를 입력할 수 있는 메뉴가 보이네요..

1. 우선 테스트 삼아 프로젝트를 생성한후, 소스 상에서 XML 주석을 달아 줍니다.
GhostDoc를 설치하셨다면 팝업메뉴에서 확인이 가능하죠. ^^
사용자 삽입 이미지

2. 프로젝트 프로퍼티에 >> 빌드 >> 이곳에서 XML documention  옵션을 체크 해주셔야 xml 문서를 생성하실 수 있습니다.
이옵션을 체크하고 프로젝트를 빌드하면 프로젝트 폴더에 XML 파일이 생성된 것을 확인하실 수 있습니다.
사용자 삽입 이미지

3. SandCastle HelpBuilder 를 실행시키고, 생성된 Xml 파일을 Add 시킵니다.
여기서 한가지 주의 해야 할 점은.. SandCastle이 Xml 파일과 프로젝트 빌드로 만들어진 결과물(Exe, Dll)에 대한 정보 또한 필요로 한다는 점입니다.
프로젝트 생성과정에서 결과물이 생성되는 폴더에 대한 옵션을 건드리지 않았다면 XML 애드만 시켜주시면 자동적으로 연결이 되는데요..

만약 OutPut 폴더를 다른 곳으로 걸어주셨을경우에는 우선 XML 을 애드 한후,
SandCastle 의 Edit 버튼을 누르시고   AssemblyPath 에서 아웃풀 경로를 적어주셔야 합니다. ^^*
사용자 삽입 이미지

빌드를 수행하시면 MSDN 과 같은 헬프 파일을 보실 수 있습니다.

SandCastle 옵션 설정

귀찮은 관계로 기본 옵션을 사용하기로 했습니다만..
상속된 요소들까지 헬프파일에 포함을 시켰더니 용량또한 늘어나고 빌드 시간 또한 길어지는군요..
이부분을 False 처리해주었습니다.
사용자 삽입 이미지

그리고 위 메뉴중 Help File >> Language 탭에 가보시면 한국어 또한 ^^*
GhostDoc Xml 주석달기
소스 코드 상에서 마우스 우클릭 Document this 메뉴를 클릭해보면..
함수를 예로 들경우.. 아래와 같이 자동 주석이 달리는 군요..

사용자 삽입 이미지

Tests the function << 이부분에 함수에 대한 요약을 적어 주고..
보시면 파라미터 에 대한 주석과 리턴 값에 대한 주석 또한 달아 줄 수 있습니다.

또한 함수가 아닌 클래스에 대한 정보라던지 변수에 대한 정보 또한 표현이 가능하네요..

테스트를 사내 소스로 해봤더니 공개 하기가 그르네요.. ㅎㅎ;;
완성품의 일부만 봐볼까요 ^^;;
사용자 삽입 이미지
사용자 삽입 이미지

'Program > Info Etc' 카테고리의 다른 글

vs2005 원격 디버깅.  (0) 2008.03.04
비쥬얼 스튜디오 필수 유틸 목록  (0) 2008.02.03
SVN 설치/ 사용법  (0) 2008.01.22
:

시스템 / 프로세스 메모리 구하기

Program/C# 2008. 2. 2. 23:51
시스템 메모리 구하기
유경상 님의 블로그 http://www.simpleisbest.net/archive/2005/11/23/300.aspx

해당 프로세스 메모리 구하기
System.Diagnostics.Process ie = System.Diagnostics.Process.GetCurrentProcess();;
MessageBox.Show(Convert.ToInt32(Convert.ToInt32(ie.WorkingSet)/1024).ToString());

'Program > C#' 카테고리의 다른 글

C# 에서의 클래스 이름이란..?  (0) 2008.02.13
C# 에서 Win32 함수 쓰기.. C# C++ 자료형 비교  (0) 2008.01.17
C# Dll Load  (1) 2008.01.17
:

C# 에서 Win32 함수 쓰기.. C# C++ 자료형 비교

Program/C# 2008. 1. 17. 17:03

C#에서 Win32 API 사용하기

 

개요

Win32 API를 불러올 때, 함수의 명칭, 인자, 리턴 값을 가지고 불러오게 되어 있다. 하지만, C#에서 타입들이 모두 객체(Object)의 형식이며, 일반적인 C 의 데이터 형과 상이한 모양을 가진다. 이러한 문제들을 해결할 수 있는 것이 PInvoke 기능이다.

 

PInvoke( Platform Invocation Service)는 관리화 코드에서 비관리화 코드를 호출할 방법을 제공한다. 일반적인 용도는 Win32 API의 호출을 위해 사용한다.

 

namespace PinvokeExample

{

using System;

 

             using System.Runtime.InteropServices; // 반드시 입력해야 한다.

 

             public class Win32

             {

                           [DllImport(“user32.dll”)]

                           public static extern int FindWindow(string a, string b);

                          

             }

}

 

위 예제는 FindWindow라는 user32.dll C함수를 사용하는 모습을 보여주고 있다. 실제 FindWindow의 선언은 다음과 같다.

 

             HWND FindWindow(LPCSTR swClassName, LPCSTR swTitle);

 

HWND는 윈도우 핸들을 표현하는 32비트 정수 이므로, int형으로 치환되고 LPCSTR 형은 NULL로 끝나는 문자열을 표현한다. 이때 PInvoke string을 자동으로 LPCSTR로 치환해 주는 역할을 하게 된다.

이 문서에서는 이처럼 Win32 API 함수의 여러 유형들을 어떻게 C#에서 사용 할 것인지에 대하여 알아보자.

 

WIN32 데이터형의 치환

Win32 API에서 일반적으로 사용하고 있는 데이터형은 모두 C#의 데이터 형으로 치환될 수 있다.

 

Win32 API TYPE

C#

BOOL, BOOLEAN

bool

BYTE

byte

CALLBACK

delegate

COLORREF

int

DWORD

int

DWORD_PTR

long

DWORD32

uint

DWORD64

ulong

FLOAT

float

HACCEL

int

HANDLE

int

HBITMAP

int

HBRUSH

int

HCONV

int

(모든 HANDLE 타입) Hxxxx

int

LPARAM

long

LPCSTR

[in] string [out] StringBuilder

LPBOOL

ref bool

이외 LP*

ref 형식

UINT

uint

Uxxxx

unsigned 타입들..

WORD

Short

WPARAM

Uint

 

 

Structure 의 전달

예를 들어 POINT 형의 경우,

typedef struct t_Point {

             int x;

             int y;

} POINT;

 

이것은 기본적으로 다음과 같이 선언될 수 있다.

[순차적]

[StructLayout(LayoutKind.Sequential)]
public struct Point {
      public int x;
      public int y;
}

 

[명시적]

[StructLayout(LayoutKind.Explicit)]
public struct Point {
      [FieldOffset(0)] public int x;
      [FieldOffset(4)] public int y;
}

 

일차적으로 할당되는 메모리 레이아웃이 동일하다면, C#에서 바로 받아 들이 수 있다.

 

// BOOL SetWindowPos(POINT pos); 이런 함수가 있다고 가정하면… ^^

 

[DllImport (“user32.dll”)]

public static extern bool SetWindowPos(Point pos);

 

사용할 함수 이름 바꾸기

여기서 함수의 이름을 바꿔서 사용하고 싶다면 다음과 같이 변경하면 된다.

 

// BOOL SetWindowPos(POINT pos);

 

[DllImport (“user32.dll”, EntryPoint = “SetWindowPos”)]

public static extern bool ShowAt(Point pos);

레퍼런스형 전달하기

 

LPPOINT형은 POINT의 포인터 형이므로 ref Point와 같이 사용 할 수 있다. 실제 사용하는 형식은 다음과 같다.

C 언어의 포인터의 경우 레퍼런스로 사용하려고 하면, ref 키워드를 사용하는 방법이 있다.

// BOOL SetWindowPos(HWND hWnd, LPRECT lpRect);

[DllImport(“user32.dll”)]

public static extern bool SetWindowPos(int hWnd, ref Rect lpRect);

 

Out형 함수 인자 사용하기

MSDN 같은 곳에서 함수의 선언을 살펴보면 다음과 같은 형식의 함수를 볼 수 있을 것이다. 이러한 형식은 레퍼런스 형으로 결과를 함수의 인자에 보내겠다는 말이다. 이러한 형식은 Win32 API에서 많이 쓰이고 있고, 포인터를 사용하므로, 많은 주의를 기울여야 한다.

 

BOOL GetWindowRect(
  HWND hWnd,      // handle to window
  LPRECT lpRect   // window coordinates
);

Parameters

hWnd

[in] Handle to the window.

lpRect

[out] Pointer to a RECT structure that receives the screen coordinates of the upper-left and lower-right corners of the window.

 

여기서 LPRECT는 앞 절에서 설명한 Structure의 전달을 참고하여 치환 될 수 있다.

여기서 lpRect RECT의 포인터이며, GetWindowRect 함수 내에서 이 포인터에 직접 값을 쓰게 되어 있다. 즉 이 포인터는 값을 기록하기 위한 인자이지, 값을 전달하기 위한 인자는 아닌 것이다. 이것은 또 다른 C# 레퍼런스 연산자인 out 키워드를 사용하여 쉽게 해결 할 수 있다.

public static extern bool GetwindowRect(int hWnd, out Rect lpRect);

 

실제 사용하는 모습은 다음과 같다.

public static extern bool GetWindowRect(int hWnd, out Rect lpRect);

public static void UseFunction() {

        Rect _rect; // 값을 대입하지 않아도 된다.

        Win32.GetWindowRect(hwnd, out _rect);

}

 

참고로 ref 키워드는 입력과 출력 둘 다 사용 할 수 있다. 그러나 ref를 사용하는 변수가 값이 설정되어 있다는 가정을 하고 있으므로, 이전에 반드시 어떠한 값을 입력해야 한다.

실제 사용 예는 다음과 같다.

public static extern bool GetWindowRect(int hWnd, ref Rect lpRect);

public static void UseFunction() {

        Rect _rect = new Rect(); // 꼭 값을 대입해야 한다.

       

        _rect.top = 20; _rect.left = 30;

        _rect.bottom = 50; _rect.right = 60;

 

        Win32.GetWindowRect(hwnd, ref _rect);

}

 

여기서 잠깐

대중없이 Rect라는 구조체가 나오는데 이는 API에서 RECT형을 C#으로 바꾸어 사용하는 structure이다. 앞의 예제들은 다음과 같은 선언을 하였다고 가정한다.

[StructLayout(LayoutKind.Explicit)]
public struct Point {
      [FieldOffset(0)] public int top;
[FieldOffset(4)] public int left;
[FieldOffset(8)] public int bottom;
[FieldOffset(12)] public int right;

}

 

 

CALLBACK 함수의 선언

C 언어에서 콜백 함수는 함수 포인터로 존재하게 된다. 이것은 함수 인스턴스의 포인터로, 함수 자체를 전달하게 되는 방식이다. 대표적으로 사용되는 부분은 EnumWindows 함수이다.

// BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARMAM IParam)

이 함수는 현재 열려 있는 모든 윈도우 핸들을 열거하기 위한 함수로 실제 처리하는 부분은 함수 포인터, 즉 콜백함수인 lpEnumFunc에서 처리하게 되어 있다. WNDENUMPROC 타입의 선언은 다음과 같다.

// typedef BOOL (CALLBACK* WNDENUMPROC)(HWND, LPARAM);

public delegate bool Callback(int hWnd, long lParam);

이러한 콜백 함수 역할을 하는 C#의 프리미티브는 delegate이다. CALLBACK delegate로 지환된다.

 

결과적으로 다음과 같이 사용하게 된다.

namespace ada.appshare

{

             public delegate bool Callback(int hwnd, int lParam);

            

             internal class Win32

             {

               

                           internal static extern int EnumWindows(CallBack x, int y);

                           [DllImport("user32.dll")]

 

                public static bool EnumWindowsCallback(int hWnd, int lParam)
                {

                        System.Console.WriteLine(“” + hWnd);

                        return true;

                }

                

             }

 

        public static void Main(String []args)

        {

                Win32.Callback call
= new Win32.Callback(Win32.EnumWindowsCallback);

                Win32.EnumWindows(call, 0);

        }

}

 

 


 출처 : 데브피아~~~~

'Program > C#' 카테고리의 다른 글

시스템 / 프로세스 메모리 구하기  (0) 2008.02.02
C# Dll Load  (1) 2008.01.17
C# 데이터 베이스 개념  (0) 2008.01.16
:

C# Dll Load

Program/C# 2008. 1. 17. 16:20
NET Platform 에서  기존의 WIn32에 있는 함수등을 사용하는 Platform Invoke는 metadata에서 수행할 수 있습니다.
이 metadata에는 exported된 함수와 런타임시에 값을 전달할 수 있습니다. 다음 그림을 한번 보시기 바랍니다.


Platform Invoke는 unmanaged된 DLL함수를 호출하고 있습니다.


사용자 삽입 이미지

 



Platform invoke가 unmanaged된 DLL함수를 호출하려면 다음과 같은 과정을 거칩니다.

1. 그 함수를 포함하고 있는 DLL을 지정합니다.
2. 메모리에 DLL을 호출합니다.
3. 메모리에 있는 함수의 어드레스를 지정하고 함수를 호출하기 위해 필요한 값을 전달합니다.
4. unmanaged 함수로 제어권을 넘김니다.

* DLL을 로드하고 지정하는 것은 함수 호출이 처음에 발생할때만 설정하면 됩니다.
* Platform invoke에서는 exception 처리를 unmanaged 함수에 의해서 managed 로 전달합니다.


다음 예제는 argument로 문자열을 넘겨서 User32.dll 에 있는 메세지박스를 호출하고 정의하는 예제입니다.
이 예제에서 CharSet는 String과 문자열 길이를 정의하기 위해서 Auto로 설정하였습니다.

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:

using System;
using System.Runtime.InteropServices;

public class Win32
{
    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    public static extern int MessageBox(int hWnd, String text, string caption, uint type);
}

public class HelloWorld
{
    public static void Main() 
    {
       Win32.MessageBox(0, "Hello World", "Platform Invoke Sample", 0);
    }
}     
:

C# 데이터 베이스 개념

Program/C# 2008. 1. 16. 09:48



1. 시나리오
공급자는 컴포넌트를 이용하여 데이터 베이스에 엑세스 하고 데이터 셋을 구성한다.
응용프로그램은 공급자에 의해 구성된 데이터 셋의 자료들을 갱신하고 업데이트 한다.
공급자는 응용프로그램에 의해 변경된 데이터 셋의 자료들을 바탕으로 데이터 베이스를 업데이트 한다.

2. 공급자
    * 종류 : SQL, OLE DB, ODBC
    * 컴포넌트 : SqlConnection, SqlAdapter etc..

3. 데이터 셋
    * Fill()

4. 응용프로그램
    * 데이터 바인딩

:

시리얼 통신 자료 받기 메세지 Serial Port DataReceived Event

Program/C# 2008. 1. 16. 09:47
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=22421&SiteID=1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;


namespace SerialTest
{


    public partial class Form1 : Form
    {
       // Setup the port
        private SerialPort port = new SerialPort("COM8", 38400, Parity.None, 8, StopBits.One);
          
        public Form1()
        {
            InitializeComponent();
             // Enable Event handler
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
        }
       
        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {// Event for receiving data
            // Read the buffer to text box.
            statusBar1.Text = "Getting Data";
            statusBar1.Refresh();
            txtData.Text = txtData.Text + port.ReadExisting();
        }
       
        private void btn_Send_Click(object sender, EventArgs e)
        {// Button to send test data
            try
            {
                port.WriteLine("This is a test Line");

            }
            catch (Exception wex)
            {
                MessageBox.Show(wex.ToString());
            }
        }
       
        private void btn_OpenPort_Click(object sender, EventArgs e)
        {// Button to open the port
            // Begin communications
            if (port.IsOpen == false)
                try
                {
                    port.Open();
                }

                catch (Exception oex)
                {
                    MessageBox.Show(oex.ToString());
                }
        }
      
        private void btn_ClosePort_Click(object sender, EventArgs e)
        { // Button to close the port
            port.Close();
        }

        private void  btn_Close_Click(object sender, EventArgs e)
        {// Button to exit the app.
            this.Close();
        }
:

크로스 스레드, 방법: 스레드로부터 안전한 방식으로 Windows Forms 컨트롤 호출

Program/C# 2008. 1. 16. 09:46

스레드로부터 안전한 방식으로 Windows Forms 컨트롤을 호출하려면

  1. 컨트롤의 InvokeRequired 속성을 쿼리합니다.

  2. InvokeRequiredtrue를 반환하는 경우에는 컨트롤을 실제로 호출하는 대리자를 사용하여 Invoke를 호출합니다.

  3. InvokeRequiredfalse를 반환하는 경우에는 컨트롤을 직접 호출합니다.

다음 코드 예제에서는 SetText라는 유틸리티 메서드에서 이 논리를 구현합니다. SetTextDelegate 대리자 형식은 SetText 메서드를 캡슐화합니다. TextBox 컨트롤의 InvokeRequiredtrue를 반환하면 SetText 메서드는 SetTextDelegate 인스턴스를 만들고 폼의 Invoke 메서드를 호출합니다. 그러면 TextBox 컨트롤을 만든 스레드에서 SetText 메서드가 호출되고 이 스레드 컨텍스트에서 Text 속성이 직접 설정됩니다.


## 그렇다면 모든 컨트롤들에 대해서 이와 같은 작업을 각각 해줘야 하는 것인가???


http://msdn2.microsoft.com/ko-kr/library/ms171728(VS.80).aspx

'Program > C#' 카테고리의 다른 글

C# Dll Load  (1) 2008.01.17
C# 데이터 베이스 개념  (0) 2008.01.16
시리얼 통신 자료 받기 메세지 Serial Port DataReceived Event  (0) 2008.01.16
: