c#dll c++에서 사용

- c#


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


using System.Runtime.InteropServices;


namespace MyEngin

{

    [Guid("DBE0E8C4-1C61-41f3-B6A4-4E2F353D3D05")]

    public interface IManagedInterface

    {

        int add(int a, int b);

        int printHi();

    }

    [Guid("C6659361-1625-4746-931C-36014B146679")]

    public class InterfaceImplementation : IManagedInterface

    {

        public int add(int a, int b)

        {

            return a + b;

        }

        public int printHi()

        {

            Console.WriteLine("안녕");

            return 1;

        }

    }

}


속성 

응용 프로그램 -> 어셈블리 정보-> 어셈블리를 COM에 노출 체크

빌드->COM Interop 등록 체크



visual studio 명령 프롬프트

regasm MyEngin.dll /tlb MyEngin.tlb


- c++



#include <Windows.h>

#include <stdio.h>


#pragma warning (disable: 4278)


#import "MyEngin.tlb" no_namespace named_guids



void main()

{

IManagedInterface *csi=NULL; 


   CoInitialize(NULL);


   HRESULT hr = CoCreateInstance(CLSID_InterfaceImplementation,NULL,CLSCTX_INPROC_SERVER,IID_IManagedInterface,reinterpret_cast<void**>(&csi));

   int a=GetLastError();

   if(SUCCEEDED(hr))

   {

  int b=csi->add(2,3); //C# dll에 있는 함수

  

  printf("%d\n", b);

  csi->printHi();

  getchar();

  CoUninitialize();

   }


}



* GUID는 

C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\guidgen.exe로 생성 가능하다


 * 다른 PC에서 dll 사용 시 regasm 이용하여 tlb 등록하여야 함


* CoCreateInstance()에서 0x80070002 에러 발생 시

regasm MyEngin /codebase 한 후 

c++에서 빌드 하면 됌