C# 클래스 라이브러리로 프로젝트 생성

외부로 노출 할 인터페이스 정의

namespace MyServiceWrapper
{
    [Guid("7BF918A2-6633-4255-846A-3BB6A7B14151")]
    public interface IMyService
    {
        [DispId(1)]
        string MyFunction(string arg);
    }

    [Guid("01AACA37-EFEB-4277-B605-D6C05B22AFB0"),
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface MyService_Events
    {
    }
   
여기서 GUID는 Program Files\Microsoft Visual Studio 8\Common7\Tools\guidgen.exe 이용

    [Guid("1BDE44C8-5509-4f84-B090-4EB1BB09B101"),
    ClassInterface(ClassInterfaceType.None),
    ComSourceInterfaces(typeof(MyService_Events))]
    public class MyService : IMyService
    {
        public MyService()
        {
        }
   
        public string MyFunction(string arg)
        {
            return arg;
        }
    }
}

AssemblyInfo.cs 를 열어 [assembly: ComVisible(false)]를 true로 변경

프로젝트 속성 - 빌드 탭 - COM Interop 등록에 체크

프로젝트 빌드하면 MyServiceWrapper.dll 생성 됨

regasm MyServiceWrapper.dll /tlb:MyServiceWrapper.tlb
로 assembly 생성 및 등록 (.NET framework 2.0 SDK 필요)

생성된 DLL을 참조할 VC++ 프로젝트에서

#import <mscorlib.tlb> raw_interfaces_only
#import "MyService.tlb"
using namespace MyServiceWrapper;

추가 실제 DLL을 참조하는 부분에서

IMyServiceWrapperPtr iMyServiceWrapperPtr(__uuidof(MyService));
if(!iMyServiceWrapperPtr) return FALSE;
iMyServicePtr->MyFunction(_T("C# function"));
Posted by
TAG C#, COM, DLL, Interop, VC++

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32]
"midimapper"="midimap.dll"
"wavemapper"="msacm32.drv"
"aux"="wdmaud.drv"
"aux1"="wdmaud.drv"
"aux2"="wdmaud.drv"

Posted by