C# DLL을 C, C++, MFC에서 쓰는 방법

-- C# 2011. 6. 29. 10:08
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
C#에서 C++이나 VB로 된 DLL을 Interop해서 쓰는 방식이 .NET으로 전환하는 요즘의 대세이건만 언제나 그 반대의 경우도 존재하게 마련이다. C#에서는 Typelib를 tlbimp해서 dll을 참조하는 방법과 dllimport Attribute를 이용해서 dll을 참조하는 방법이 있는데 보통 typelib는 COM이나 ActiveX 형태의 dll을, dllimport는 extern이나 static으로 외부로 인터페이스를 제공하는 dll을 참조하는 경우이다.

1. C#으로 필요한 기능을 구현한다. 이때 dll은 COM으로 등록시킨다.
그러기 위해서 외부로 노출시킬 Interface를 생성하여 이를 상속받는 클래스를 생성한 후, GUID를 부여해야한다.

2. 생성된 C# dll을 regasm으로 등록하고 이때 생성된 *.tlb파일을 C++에서 import하고 Interface를 통해 클래스의 메소드를 호출한다.

[C# DLL]

using System;
using System.Runtime.InteropServices;
namespace ClassLibrary2
{
   // Since the .NET Framework interface and coclass have to behave as
   // COM objects, we have to give them guids.
  [Guid("DBE0E8C4-1C61-41f3-B6A4-4E2F353D3D05")]
   public interface IManagedInterface
   {
       int add(int a, int b);
   }
   [Guid("C6659361-1625-4746-931C-36014B146679")]
   public class InterfaceImplementation : IManagedInterface
   {
      public int add(int a,int b)
      {
          return a + b;
      }
   }
}

com으로 등록시키기 위해서는 외부 interface를 생성하고, 이 인터페이스를 상속받는 클래스를 만들어야 한다. 그러기 위해서는 regasm을 이용해야 한다.regasm이라는  어셈블리 등록 도구를 사용하면 어셈블리 내의 메타데이터를 읽고 필요한 엔트리를 레지스트리에 추가할 수 있다.  이렇게 하면 COM 클라이언트에서 .NET Framework 클래스를 투명하게 만들 수 있을 뿐만 아니라 클래스가 등록되고 나면 COM 클라이언트에서는 해당 클래스가 마치 COM 클래스인 것처럼 사용할 수 있다. 클래스가 실제로 등록되어야만 COM에서 어셈블리 내의 클래스 인스턴스를 만들 수 있다

regasm a.dll /tlb:a.tlb

[C++]

#import "a.tlb" no_namespace named_guids
   IManagedInterface *csi=NULL;
   CoInitialize(NULL);

   HRESULT hr = CoCreateInstance(CLSID_InterfaceImplementation,NULL,CLSCTX_INPROC_SERVER,IID_IManagedInterface,reinterpret_cast(&csi));
   int a=GetLastError();
   if(SUCCEEDED(hr))
   {
   int b=csi->add(2,3); 
   CoUninitialize();

}

만약 C# 함수가 노출되지 않는다면, dll을 만든 C#프로젝트에서 속성->응용 프로그램->어셈블리정보->어셈블리를 COM에 노출을 체크해주면 된다.

참조 : http://blog.naver.com/yiyunju?Redirect=Log&logNo=150043783398
참조 : http://blog.naver.com/horsepia?Redirect=Log&logNo=90004037008

'-- C#' 카테고리의 다른 글

Sealed Class  (0) 2011.07.08
Using The C# WebClient class to upload and download FTP files  (0) 2011.06.29
const vs readonly  (0) 2011.05.13
C# Switch Fall-through  (0) 2011.05.13
Dll Reference  (0) 2009.07.23
posted by 어린왕자악꿍