Languages/C, C++2012. 8. 17. 17:17

C# 에서 C++로 작성된 dll 을 사용할 경우에는 DllImport 를 사용하여 손쉽게 사용할 수 있지만

C++ 에서 C#으로 작성된 dll 을 사용할 경우에는 COM으로 등록하는 작업이 추가적으로 필요합니다.

사용법에 대해서 하나씩 살펴보겠습니다.

 

[ C# dll ]

 

1. C++에서 사용가능한 메소드를 노출시키기 위한 인터페이스를 선언합니다.

 

Tip

 

- Guid 는 Visual Studio의 [ Tools ] - [ Create GUID ] 메뉴를 통해 쉽게 만들 수 있습니다.

- [ComVisible(true)] 대신 다음과 같이 Make assembly COM-Visible을 체크할 수 있습니다.

 

[ComVisible(true)]

[Guid("61EA822A-82BC-4CCE-A0BF-5A24855FF613")]

public interface ICShapSample

{

    void ShowMessage();

}

 

2. 인터페이스를 상속받아 클래스를 구현합니다.

 

[ComVisible(true)]

[ClassInterface(ClassInterfaceType.None)]

[Guid("36EA856C-99E3-4365-B157-6C0D75173F48")]

public class CShapSample : ICShapSample

{

    public void ShowMessage()

    {

        MessageBox.Show("Hello World!!");

    }

}

 

3. dll 을 COM으로 등록합니다.

 

두 가지 방법이 있습니다.

 

1 ) Visual Studio를 관리자 권한으로 실행 시킨 후 다음과 같이 Register for COM interop을 선택한 후 빌드합니다.

 

 

2 ) 커맨드 창을 관리 권한으로 실행시 킨 후 regasm 을 이용해 등록합니다.

- 환경변수가 설정이 되어 있지 않으면

  C:\Windows\Microsoft.NET\Framework\v4.0.30319 ( 설치 버전에 따라 다름 )

  경로에 있는 RegAsm 과 regasm 파일을 dll 폴더에 복사합니다.

  커맨드 창에서 dll 폴더로 이동한 후,

  regasm ClassLibrary.dll /tlb 를 입력 후 실행합니다.

 

[ 등록이 완료되면 tlb 파일이 생성됩니다. ]

 

[ C++ ]

 

tlb 파일을 import 하여 사용합니다.

 

#include <Windows.h>

 

#import "..\ClassLibrary\bin\Debug\ClassLibrary.tlb"

 

using namespace ClassLibrary;

 

void main()

{

             CoInitialize(NULL);

 

             ICShapSamplePtr ptr(__uuidof(CShapSample));

             ptr->ShowMessage();

 

             ptr->Release();

             CoUninitialize();

}

 

[ 실행화면 ]

 

 

CShapDllImport.zip

 

Posted by 열ㅇl