posted by 방랑군 2012. 1. 21. 22:31
 C#에서는 현재 응용프로그램이 실행중인 운영 체제에 있는 DLL의 함수를 플랫폼 호출(platform invoke)이라는 런타임 기능을 통해 호출할 수 있다.
  단순히 DllImport 어트리뷰트를 사용하여 DLL을 불러오면 된다.

MSDN



  다음 예제는 Win32API의 MessageBoxA함수를 사용하기 위해서 Windows DLL을 불러오는 간단한 콘솔 응용 프로그램이다. (물론 .NET의 System.Windows.Forms 네임스페이스에 MessageBox 클래스가 존재하고 이 것을 통해 활성화-Show-하는 방법이 존재한다.)

예제소스


  위의 응용 프로그램을 실행한 결과는 다음 그림에서 볼 수 있다.

.NET 런타임은 관리되는(managed) C# 코드에서 원본 DLL 함수까지 파라미터를 정렬시킨다. 그리고 MessageBox와 같은 메크로가 아닌 MessageBoxA나 MessageBoxW와 같은 실제 함수를 사용해야만 한다.

MSDN



  마지막으로 DllImport 어트리뷰트는 몇 가지 파라미터가 더 포함되어 있다.

DllImport 매개 변수


  런타임 시 관리되는(managed)코드에서 비관리(unmanaged) 코드까지 구조체를 올바르게 정렬시키려면 구조체 정의에 덧붙여 어트리뷰트를 선언해야 한다. 예를 들어, SystemTime구조체를 파라미터로 취하는 Win32 API 함수인 GetLocalTime을 선언할 수도 있다.

예제소스



 올바르게 정렬되는 구조체 파라미터의 경우에는 데이터가 선언된 대로 정확하게 정렬하는 것을 지정하는 StructLayout 어트리뷰트와 함께 선언해야 한다이런 방법을 사용하지 않는다면 데이터는 올바르게 정렬되지 않고 응용 프로그램은 오류가 발생할 것이다.

접기

        [StructLayout(LayoutKind.Sequential)]
        public class SystemTime {
            public ushort wYear;
            public ushort wMonth;
            public ushort wDayOfWeek;
            public ushort wDay;
            public ushort wHour;
            public ushort wMinute;
            public ushort wSecond;
            public ushort wMilliseconds;
        }

접기


다음과 같이 함수를 호출해 보자.

접기

        static void Main(string[] args)
        {
            SystemTime st = new SystemTime();
            GetLocalTime(st);
            string s = string.Format("date: {0}-{1}-{2}", st.wMonth, st.wDay, st.wYear);
            MessageBox(0, s, "Now", 0);                        
        }

접기



  위의 코드를 실행하면 다음 그림과 같은 대화 상자가 나타난다.



  또한 Win32 API 및 C 스타일 함수에서 사용되는 데이터 형식에 대하여 관리 코드에서 사용하는 .NET Framework 기본 제공 값 형식 또는 클래스로 대치 시켜 줘야 한다. 그에 대한 내용은 다음 링크를 참조! ^^
2009/07/06 - [Programming/C#] - 플랫폼 호출 데이터 형식



참고문헌: Inside C#

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

_문자열 마샬링  (0) 2012.01.21
_플랫폼 호출 데이터 형식  (0) 2012.01.21
16진수 문자열 변환  (0) 2012.01.21
VB.NET and C# 의 비교문서  (0) 2012.01.21
C# 으로 만든 DLL asp에서 사용  (0) 2012.01.21
posted by 방랑군 2012. 1. 21. 22:09

이 예제에서는 string에 있는 각 문자의 16진수 값을 출력합니다. 먼저 string을 문자 배열로 구문 분석합니다. 그런 다음 각 문자에 대해 ToInt32(Char)를 호출하여 해당 숫자 값을 가져옵니다. 마지막으로 이 숫자를 16진수 형식으로 string에 나타냅니다.


C#
string input = "Hello World!";
char[] values = input.ToCharArray();
foreach (char c in values)
{
    // Get the integral value of the character.
    int value = Convert.ToInt32(c);
    // Convert the decimal value to a hexadecimal value in string form.
    string hex = String.Format("{0:X}", value);
    Console.WriteLine("Hexadecimal value of {0} is {1}", c, hex);
}

Hexadecimal value of H is 48
Hexadecimal value of e is 65
Hexadecimal value of l is 6C
Hexadecimal value of l is 6C
Hexadecimal value of o is 6F
Hexadecimal value of   is 20
Hexadecimal value of W is 57
Hexadecimal value of o is 6F
Hexadecimal value of r is 72
Hexadecimal value of l is 6C
Hexadecimal value of d is 64
Hexadecimal value of ! is 21

이 예제에서는 16진수 값의 string을 구문 분석하고 각 16진수 값에 해당하는 문자를 출력합니다. 먼저Split(array<Char>[]()[]) 메서드를 호출하여 각 16진수 값을 배열의 개별 string으로 가져옵니다. 그런 다음ToInt32(String, Int32)를 호출하여 16진수 값을 int로 표현되는 10진수로 변환합니다. 이 예제에서는 문자 코드에 해당하는 문자를 가져오는 두 가지 방법을 보여 줍니다. 첫 번째 방법에서는 정수 인수에 해당하는 문자를 string으로 반환하는 ConvertFromUtf32(Int32)를 사용합니다. 두 번째 방법에서는 int를 char로 명시적으로 캐스팅합니다.

string hexValues = "48 65 6C 6C 6F 20 57 6F 72 6C 64 21";
string[] hexValuesSplit = hexValues.Split(' ');
foreach (String hex in hexValuesSplit)
{
    // Convert the number expressed in base-16 to an integer.
    int value = Convert.ToInt32(hex, 16);
    // Get the character corresponding to the integral value.
    string stringValue = Char.ConvertFromUtf32(value);
    char charValue = (char)value;
    Console.WriteLine("hexadecimal value = {0}, int value = {1}, char value = {2} or {3}", hex, value, stringValue, charValue);
}

hexadecimal value = 48, int value = 72, char value = H or H
hexadecimal value = 65, int value = 101, char value = e or e
hexadecimal value = 6C, int value = 108, char value = l or l
hexadecimal value = 6C, int value = 108, char value = l or l
hexadecimal value = 6F, int value = 111, char value = o or o
hexadecimal value = 20, int value = 32, char value =   or
hexadecimal value = 57, int value = 87, char value = W or W
hexadecimal value = 6F, int value = 111, char value = o or o
hexadecimal value = 72, int value = 114, char value = r or r
hexadecimal value = 6C, int value = 108, char value = l or l
hexadecimal value = 64, int value = 100, char value = d or d
hexadecimal value = 21, int value = 33, char value = ! or !

이 예제에서는 Parse(String, NumberStyles) 메서드를 호출하여 16진수 string을 정수로 변환하는 다른 방법을 보여 줍니다.

string hexString = "8E2";
int num = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber);
Console.WriteLine(num);



출처: http://msdn.microsoft.com/ko-kr/library/bb311038.aspx