Windows2013. 5. 23. 17:31




C DLL이 다음 처럼 2개의 함수를 노출한다고 할 때

DLLFunction int addint(int n1, int n2)

{

   return n1 + n2;

}

DLLFunction int addchar(char* s1, char* s2, char* added)

{

   sprintf(added, "%s%s", s1, s2);

   return strlen(added);

}


C#에서는 다음 코드와 같이 사용 가능하다.

여기서 요점은 c data type과 C# data type을 매칭하는것인데. 이 때 메모리를 할당하여 포인터를 전달하거나 struct 데이터를 전달할 경우 Marsal 클래스를 사용해야 한다. (참조 : http://rainiac.com/dev/index.php/c-interop-c%EA%B3%BC-c-api%EC%9D%98-%EC%83%81%ED%98%B8%EC%9A%B4%EC%98%81/)


using System.Runtime.InteropServices; 


// 빈 페이지 항목 템플릿에 대한 설명은 http://go.microsoft.com/fwlink/?LinkId=234238에 나와 있습니다.



namespace DllTestApp1

{

    class Dll

    {

        [DllImport("Win32Project1.dll")]

        public static extern int addint(int n1, int n2);

        [DllImport("Win32Project1.dll")]

        public static extern int addchar(StringBuilder s1, StringBuilder s2, StringBuilder s3);   

    }



    /// <summary>

    /// 자체에서 사용하거나 프레임 내에서 탐색할 수 있는 빈 페이지입니다.

    /// </summary>

    public sealed partial class MainPage : Page

    {

        public MainPage()

        {

            this.InitializeComponent();

        }


        /// <summary>

        /// 이 페이지가 프레임에 표시되려고 할 때 호출됩니다.

        /// </summary>

        /// <param name="e">페이지에 도달한 방법을 설명하는 이벤트 데이터입니다. Parameter

        /// 속성은 일반적으로 페이지를 구성하는 데 사용됩니다.</param>

        protected override void OnNavigatedTo(NavigationEventArgs e)

        {

        }




        // add int

        private void Button_Click_1(object sender, RoutedEventArgs e)

        {

            int sum = Dll.addint((int)10, (int)200);

        }


        // add char

        private void Button_Click_2(object sender, RoutedEventArgs e)

        {


            StringBuilder aa = new StringBuilder("aa");

            StringBuilder bb = new StringBuilder("bb");

            StringBuilder added = new StringBuilder();

            Dll.addchar(aa, bb, added);

        }

    }

}


Posted by 삼스