컴퓨터/.NET

C# dll with VC

Hikasiru 2006. 9. 18. 19:01

어떻게 C#의 클래스를 VC에서 어떻게 쓸까.

1. C#에서 클래스를 만든다.
1.1 C# 클래스를 만든다.
(프로젝트 속성 -> 구성 속성 -> 빌드 -> COM Interop 등록을 true로 해주면 1.4을 안해도 됨. 그러나 어짜피 다른 컴퓨터에서 한번은 해주어야 함 -_ -)

ClassLibrary1.cs

using System;
using System.Runtime.InteropServices;

namespace ClassLibrary1
{
  [ClassInterface(ClassInterfaceType.AutoDual)]
   public class Class1
  {
       ...
  }

  public SayHello()
  {
       //do something..
  }
}


1.2 생성된 파일을 AssemblyInfo.cs의 맨 밑에 추가하여 준다.
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin\sn -k ClassLib.snk

[assembly: AssemblyKeyFile("./ClassLibrary1.snk")]

1.3 빌드
  ... -_ -

1.4 어샘블리를 등록한다.
regasm /tlb:ClassLibrary1.tlb ClassLibrary1.dll  /codebase


2.1 VC 코드를 생성한다.
#import "../Dll/mscorlib.tlb" raw_interfaces_only
using namespace mscorlib;

#import "../Dll/ClassLibrary1.tlb"
using namespace ClassLibrary1;

int main()
{
  CoInitialize(0);

  _Class1Ptr class1(__uuidof(Class1));

  class1->SayHello()

  CoUninitialize();

  return 0;
}



ps1. MessageBox와 같은 Form이 들어갈 경우 메모리 릭이 발생한다. 왜? -_ -
ps2. 클래스가 System.Windows.Forms.Form을 상속받을경우 VC에서 못부른다.. 왜? - _-
ps3. Com의 메소드로 부터 값(문자열)을 돌려받고 싶으면 out 을 쓰자.
C#
  public void MethodName(out String outString)
  {
       ...
  }

VC
  BSTR outString = 0;
  HRESULT hResult = class1->MethodName(&outString);
  if ( hResult == S_OK )
  {
       // 값을 잘 가져왔군!!
  }
   // 메모리 해제를 해주어야 함 -_ -
  USES_CONVERSION;
  CString res = OLE2CA(outString);


참조 링크: http://groups.google.com/group/microsoft.public.dotnet.languages.vc/browse_frm/thread/6bfd1115e804cc58/e6ce1ba6326bc680?q=group:microsoft.public.dotnet.languages.vc+insubject:system.xml.schema