Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷!스킬업

닷넷 기술을 조금 더 깊이 다루고자 합니다. 특정 주제를 정하지 않고 이슈 발생 시 마다 체계적으로 정리하여 공유하겠습니다. 이전 자료를 옮겨온 곳이기도 합니다.

[Attribute] - DllImportAttribute

작성자 : 박종명
최초 작성일 : 2008-05-30 (금요일)
최종 수정일 : 2008-05-30 (금요일)
조회 수 : 3106

닷넷 내장 어트리뷰트 중 DllImportAttribute 에 대해 알아보자
 
* 개요
닷넷에서 관리되지 않는(Un Managed) 함수의 호출을 위해 메서드에 선언한다. 진입점을 포함한 dll 진입점이 특성 선언시 주어져야 한다. 이 어트리뷰트가 정의된 메서드는 정적(static) 진입점으로 노출된다.
 
* Demo
임의의 사운드 파일을 윈도우의 winmm.dll 를 이용하여 Play 시키는 예제이다.  

[DllImport("winmm.dll", EntryPoint="PlaySound",CharSet=CharSet.Auto)]
private static extern int PlaySound(String pszSound, int hmod, int falgs);

extern (한정자)키워드는해당 메서드가 외부에서 구현되었음을 나타낸다.

즉, 위의 코드에서 PlaySound 는 해당 어셈블리의 내의 C# 코드 내부에서 구현된 것이 아니라 윈도우가 포함하고 있는 winmm.dll 에서 구현하고 있음을 나타내는 것이다.  따라서 메서드 본문이 없이 시그너쳐만을 정의한다.
winmm.dll 은 C:\WINDOWS\system32 에 위치한 윈도우 시스템 파일이다. 이렇게 선언하고 난뒤 관리되는 코드에서 그 함수를 적절히 호출하면 된다.

(PlaySound 함수의 자세한 사용법은 다음의 도움말에서 확인 가능하다.
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1042/multimed/mmfunc_9uxw.htm)


using System;

using System.IO;

using System.Runtime.InteropServices;

namespace DllImportAttributeDemo

{       

         class Class1

         {

                  [STAThread]

                  static void Main(string[] args)

                  {                                                   

                           Console.WriteLine("사운드파일이 재생됩니다");

                           SoundManager.PlaySound("Start.wav");

 

                           System.Threading.Thread.Sleep(500);

                          

                           Console.ReadLine();

 

                  }

         }

         class SoundManager

         {                

                  public static void PlaySound(String pszSound)

                  {

                           if(File.Exists(pszSound))

                           {

                                   PlaySound(pszSound,0,(int
                                                (SND.SND_ASYNC | SND.SND_FILENAME | SND.SND_NOWAIT));

                           }

                           else

                           {

                                   string pszSound2 = "SystemStart";

                                   PlaySound(pszSound2,0,(int
                                                   (SND.SND_ASYNC | SND.SND_ALIAS | SND.SND_NOWAIT));

                           }                

                  }                                                   

                  public enum SND

                  {

                           SND_SYNC            = 0x0000  ,/* play synchronously (default) */

                           SND_ASYNC           = 0x0001 , /* play asynchronously */

                           SND_NODEFAULT       = 0x0002 , /* silence (!default) if sound not found */

                           SND_MEMORY          = 0x0004 , /* pszSound points to a memory file */

                           SND_LOOP            = 0x0008 ,/* loop the sound until next sndPlaySound */

                           SND_NOSTOP          = 0x0010 ,/* don't stop any currently playing sound */

                           SND_NOWAIT          = 0x00002000, /* don't wait if the driver is busy */

                           SND_ALIAS           = 0x00010000 ,/* name is a registry alias */

                           SND_ALIAS_ID        = 0x00110000, /* alias is a pre d ID */

                           SND_FILENAME        = 0x00020000, /* name is file name */

                           SND_RESOURCE        = 0x00040004, /* name is resource name or atom */

                           SND_PURGE           = 0x0040,  /* purge non-static events for task */

                           SND_APPLICATION   = 0x0080 /* look for application specific association */

                  }                

                  [DllImport("winmm.dll", EntryPoint="PlaySound",CharSet=CharSet.Auto)]

                  private static extern int PlaySound(String pszSound, int hmod, int falgs);

              

         }

}

 
 

이름
비밀번호
홈페이지
BE <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요