티스토리 뷰

일반적으로 C#에서 만든 dll 파일은, 닷넷기반이기에 C++에서 그냥 사용하지는 못한다. C# 에서 만든 dll 파일을 COM에 등록시켜주고, tlb 파일을 만들어서 C++에 사용해야 한다.

 

아래부터는 Visual Studio 2010 기준으로, C# 에서 dll 을 만들어서, C++에서 사용하는 방법을 소개하였다.

 

1. C# 으로 dll 파일을 만든다.

- 프로젝트 속성의 Application 탭에서 'Assembly Information' 버튼을 클릭하면 다이얼로그 창이 하나 뜨는데, 여기서 'Make assembly COM-Visible' 에 체크한다.

- Build 탭에서 'Output' 섹션에 'Register for COM interop' 에 체크한다.

 

2. C# 소스 (더하기 프로그램)

- [Guid]를 사용하기 위해, System.Runtime.InteropServices를 추가한다.

- Visual Studio 2010 에는 상단메뉴 Tools 에 Create GUID 가 있어, Guid를 생성해 쓸 수 있다.

 

using System;

using System.Runtime.InteropServices;

 

namespace dlltest

{

   [Guid("401B695E-D0D0-4461-AC84-DDFBF870EE68")]

   public interface ICsharpDLL

   {

      int add(int a, int b);

   }

 

   [Guid("95F2DE69-42F4-4B35-9179-6634F108C309")]

   public class CSharpDLL : ICSharpDLL

   {

      public int add(int a, int b)

      {

         return a+b;

      }

   }

}

- 단순히 정수 두 개를 입력받아 반환해주는 함수이다.

 

3. dll 을 COM 에 등록시키기

- COM에 등록시키기 위해는, regasm 이라는 어셈블리 등록도구를 사용해야 한다. regasm을 사용하면, .NET Framework 클래스가 마치 COM 클래스인 것 처럼 사용할 수 있다.

 

regasm.exe 는 Microsoft.Net 에 포함되어 있다. CMD 창을 열어, C:\windows\Microsoft.NET\Framework\v2.0.50727\ 경로로 이동한다. (v2.0.50727 폴더가 없을 경우에는, v4.0.30319 폴더로 이동해도 무방하다)

 

regasm dll파일경로 /tlb:dll파일이름.tlb

 

라고 입력하면, dll 파일이 있는 곳에 tlb 파일이 생긴다.

(위의 소스를 예로 들면, regasm C:\dlltest.dll /tlb:dlltest.tlb 라고 치면 된다)

 

4. C++ 에서 dll 파일 불러와 사용하기

 

[헤더파일]


#import "dlltest.tlb" no_namespace named_guids

헤더파일에 위와 같이 추가해준다. 그러면, C++ 프로젝트 폴더에, dll파일이름.tlh 파일이 생긴다.

 

[소스파일]


ICSharpDLL *cpi = NULL;

CoInitialize(NULL);

 

HRESULT hr = CoCreateInstance(CLSID_CSharpDLL, NULL, CLSCTX_INPROC_SERVER,

IID_ICSharpDLL, reinterpret_cast<void**>(&cpi));

 

if(SUCCEEDED(hr))

{

   int result = cpi->add(5, 10);

   print("Result : %d\n", result);

}

 

CoUninitialize();</void**>

ICharpDLL 대신에 자신이 만든 C# dll 파일의 인터페이스명을, CSharpDLL 대신에 자신이 만든 C# dll 파일의 클래스명을 써주면 된다.



출처: http://900ift.tistory.com/70 [혼자놀기]

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함