C#에서 .dll로 library를 만들고 이것을 C++에서 사용하기


(C++에서 C# .dll 라이브러리 사용하는 법)


C#은 MFC에 비해 여러면에서 개발자 편의적이다. 따라서 C#으로 만든 프로그램을 .dll 라이브러리로 만들고 이것을 C++ 혹은 MFC에서 사용하는 방법에 대해서 다루고자 한다.


전개순서는


-. C#을 클래스 라이브러리로 개발하기

-. C#을 .dll library로 만들기 위한 Visual Studio 2017에서 속성 설정하기

-. C# 프로그램이 .dll library로 MFC(혹은 C++)와 동작하기 위한 소스 코드 작성법

-. C# 소스코드 빌드하기

-. 빌드된 C#의 .dll을 레지스트리 등록 및 .tlb 파일 만들기

-. C++ 쪽에서 C#용 .dll 파일 사용하기 위한 소스 코드 작성법


의 순서로 진행이 된다.


1) C#을 클래스 라이브러리로 개발하기


Visual Studio 2017 파일 - 새로 만들기 - 프로젝트 - 클래스 라이브러리(.NET Framework)



이렇게해서 소스코드 창이 열리면 


2) C#을 .dll library로 만들기 위한 Visual Studio 2017에서 속성 설정하기
다음과 같이 해당 프로젝트의 속성을 C# 클래스 라이브러리(.dll) 용으로 설정해 준다.





3) C# 프로그램이 .dll library로 MFC(혹은 C++)와 동작하기 위한 소스 코드 작성법

소스 코드는 크게 두 부분으로 구성이 된다. C++과 통신하기 위한 interface 하나와 필요한 사용자 기능을 위한 class 하나이다. 이 둘에 대한 Guid 값을 지정해 주어야 하는데 Guid 값을 얻기 위해서는 아래 그림과 같이 하면된다.




'복사' 버튼을 클릭하여 Guid 값을 소스코드에(interface와 사용자 클래스에) 붙여넣으면 된다.

소스 코드는 아래와 같다. Guid가 붙여진 곳을 확인해보자.

여기서 또 기억할 사항은 Guid값을 소스코드에서 사용할수 있기 위해서는 using System.Runtime.InteropServices를 추가해 주어야 한다.


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Runtime.InteropServices;


namespace ExMakeClassLib

{

    //여기가 C++과 연동하기 위한 interface부분이다.

    [Guid("357CCEDB-44A1-481E-A42A-0D4DCA8C5EEA")]

    public interface ICallClass

    {

        //여기에 C++에서 사용할 메소드들의 프로토타입을 지정해 주면 된다.

        //C++에서 사용하게 될 public 형태의 메소드들이 여기에 해당된다.

        //private 모드의 메소드는 여기에 지정이 불가능하다. 

        //생성자는 여기서 지정해 줄 필요가 없다.

        //메소드들만 지정해 주면 된다.

        void setInfo(String _name, int age, String _phoneNum);

        void showInfo();

    }



    //여기가 사용자가 원하는 기능을 구현한 클래스이다.

    [Guid("D00C0769-26E7-4B4E-A7D0-8CAAE2AB3702")]

    public class Class2 : ICallClass

    {

        private String name;

        private int age;

        private String phoneNum;

        //여기서 주의 해야할 사항은 SerialPort나 Thread 같은경우 처음 사용 후에 

        //포트를 닫는 동작이 필요하거나 Thread를 종료시키는 동작이 필요할 경우 등

        //여러 메소드들에서 사용을 해야하는 멤버 변수들은 반드시 static으로

        //선언해 주어야 한다. 왜냐하면 비록 전역 변수 형태로 선언되었다 할지라도

        //처음 사용했던 메소드가 아닌 다른 메소드에서 또 사용되어질 경우는

        //해당 멤버 변수(Thread, SerialPort...)가 null 상태가 되어 버린다.

        //따라서 C++에서 계속해서 해당 멤버 변수를사용할수 있도록 하기 위해서는

        //반드시 static으로 선언해 주어야 한다.


        public Class2() { }


        public Class2(String _name, int _age, String _phoneNum)

        {

            name = _name;

            age = _age;

            phoneNum = _phoneNum;

        }


        public void showInfo()

        {

            Console.WriteLine("▶ name : " + name + "\n▶ age : " + age + "\n▶ 폰번호 : " + phoneNum);

            Console.WriteLine("---- This is C# Library for C++ from Joe");

        }


        public void setInfo(String _name, int _age, String _phoneNum)

        {

            name = _name;

            age = _age;

            phoneNum = _phoneNum;

        }

    }

}



4) C# 소스코드 빌드하기

Visual Studio 2017의 메뉴에서 '빌드' - '해당프로젝트명 빌드'를 클릭하여 소스 코드를 빌드한다.

(아래 이미지의 경우는 프로젝트 명이 ExMakeClassLibSerialRead라고 가정할 경우이다)



C#의 프로젝트명\bin\Debug\해당프로젝트명.dll 이 생성이 되어 있을 것이다.



5) 빌드된 C#의 .dll을 레지스트리 등록 및 .tlb 파일 만들기

.tlb 파일을 만드는 이유는 C#은 .NET 기반이기 때문에 이를 C++에서 사용가능하도록 하기 위해서이다.


"Developer Command Prompt for VS 2017"창을 관리자 권한으로 열고 C#의 해당 .dll이 있는 경로로 이동한다.

"Developer Command Prompt for VS 2017"창을 열어야 regasm을 정상적으로 이용할수 있다.

여는 방법은 윈도우즈의 시작 - Visual Studio 2017 하위 항목 열기 - Developer Command Prompt for VS 2017 메뉴 위에서 마우스 우측 클릭 - 관리자 권한으로 실행한다.

(만일 DOS 창을 관리자 권한으로 열어서 사용할 경우는 regasm.exe를 C#의 .dll이 있는 폴더로 복사해서 아래 명령을 처리하면된다)


C#용 .dll이 있는 디렉토리로 이동해서 다음 명령을 한다. 

아래에서 ExMakeClassLib는 프로젝트 명이다.


regasm ExMakeClassLib.dll /tlb:ExMakeClassLib.tlb


그러면 다음과 같은 메시지가 보이면 성공한 것이다.


Microsoft .NET Framework 버전 4.7.2556.0용

Microsoft .NET Framework Assembly Registration Utility 버전 4.7.2556.0

Copyright (C) Microsoft Corporation.  All rights reserved.


형식이 등록되었습니다.

어셈블리를 'D:\Joe\CSharp\ExMakeClassLib\ExMakeClassLib\bin\Debug\ExMakeClassLib.tlb'(으)로 내보내고 형식 라이브러리를 등록했습니다.


.dll과 .tlb 생성은 C# 소스 코드를 수정할 때마다 항상 같이 만들어 주어야 한다.

이렇게 만들어진 .dll과 .tlb를 C++의 프로젝트가 있는 디렉토리와 C++의 실행파일이 있는 위치에 복사해 준다.

이렇게 만들어진 C#용 library를 C++(혹은 MFC)에서 어떻게 사용하는지는 아래 링크에서 확인할수 있다.

(C++에서 C# .dll 라이브러리 사용하는 법)



+ Recent posts