'dll'에 해당되는 글 2건

  1. 2008.02.13 Dll 로드시 자료형.. 1
  2. 2008.01.17 C# Dll Load 1

Dll 로드시 자료형..

Program/C# 2008. 2. 13. 16:49
C, C++ 로 만들어진 DLL 들을 로드 할때 자료형을 맞추는 일은 처음 하시는 분에게는 까다로운 일이 아닐겁니다.

제 경험상 까다로운 몇몇의 자료형 들에 대해서 예를 들어 보겠습니다.

HWND >> int
    ( 이 인트값은 C# 에서 구해진 IntPtr의 .ToInt32() 변환값으로 채워질 것입니다)
WChar *  >>  [MarshalAs(UnmanagedType.LPWStr)]String
    ( 이는 C# 에서 문자열로 채워질 것입니다)


Marshal 이라는 것 상당히 흥미로운데요..
간단히 알아본봐 Managed & Unmanaged Code 사이의 데이터 타입을 정렬하다..? 라는 군요..

실제로 Marshal 이라는 클래스를 보면 .C++에서 사용되는 자료형들(대표적으로 포인터) 등을
C# 에서도 사용가능하도록 자료형을 맞춰주는 군요...
간단히 몇가지 함수를 보면.. 파라미터는 MSDN 참고 해주시고..
Marshal.PtrToStructure(...)  >> 파라미터러 넘어온 포인터를 구조체 객체로 바꿔주죠...
Marshal.PtrToStringUni(...)  >> 파라미터로 넘어온 포인터를 유니코드 스트링으로 바꿔줍니다.

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

FileSystemWatcher 폴더내 파일 변화 감시  (0) 2008.02.29
메세지 관련..  (0) 2008.02.13
UnSafe 컴파일 옵션..  (0) 2008.02.13
:

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);
    }
}     
: