ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# dll with VC
    컴퓨터/.NET 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

Designed by Tistory.