티스토리 뷰
일반적으로 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 [혼자놀기]
'Programming > C,C++' 카테고리의 다른 글
COleDateTime 을 이용하여 계산하기 (0) | 2017.03.03 |
---|---|
웹에서 간단한 C/C++ 코드 테스트를 하자 (0) | 2016.07.08 |
[C] format 형식 지정시 숫자 앞에 0 붙이기 (0) | 2016.05.03 |
[Effective C++ 정리] #define을 쓰려거든 const, enum, inline을 떠올리자 (0) | 2014.06.05 |