검색결과 리스트
C에서사용에 해당되는 글 1건
- 2011.06.29 C# DLL을 C, C++, MFC에서 쓰는 방법
글
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
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
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 |
RECENT COMMENT