2017 년 VB6에서 .NetFramework DLL을 호출

7577 단어 VB6.0.NETFrameworkdll
도대체 뭐하고 있어...

1. 환경



1.1. .Net Framework


  • Visual Studio 2017
  • C#
  • Windows 10 (summer) Creators Update (bootcamp)

  • 1.2. VB6


  • VB6 Enterprise (SP6, SP6B 적용)
  • Windows 10 (summer) Creators Update (bootcamp)

  • VB6을 Win10에 설치하는 방법

    VB6은 MSDN에서 구할 수 있습니다.


    2. DLL 측 준비



    MS 문서 참조하면 DLL에서 COM 상호 참조 기능에서 사용할 수 있도록 다음과 같은 준비가 필요합니다.
  • 클래스는 공용이어야 합니다.
  • 속성, 메서드 및 이벤트가 공용이어야 합니다.
  • 속성과 메서드가 클래스 인터페이스에서 선언되었습니다.
  • 이벤트가 이벤트 인터페이스에서 선언되었습니다.

  • 퍼블릭인 것은 COM 상호 참조 기능이 아니어도 필요하므로, 인터페이스의 선언이 필요하게 된다.
    이 경우 System.Runtime.InteropServices 네임 스페이스의 COM 참조에 대한 속성을 선언해야합니다.

    간단한 MyMath 클래스를 만들고 COM 상호 참조 가능하게 수정해 봅니다.
    다음과 같은 클래스다.
    namespace MyClassLibrary
    {
        public class MyMath {
            public int Add(int a, int b) {
                return a + b;
            }
        }
    }
    

    이것을 다음과 같이 수정한다.
    using System.Runtime.InteropServices;
    
    namespace MyClassLibrary
    {
        public interface IMyMath
        {
            int Add(int a, int b);
        }
    
        [ClassInterface(ClassInterfaceType.None)]
        public class MyMath : IMyMath
        {
            public int Add(int a, int b)
            {
                return a + b;
            }
        }
    }
    

    참고 문서에서는 Guid 애트리뷰트를 이용하고 있지만, 명시 지정할 필요는 없을 것 같다.

    2017/10/10 추가
    Guid 속성은 COM에 등록할 때의 ID가 되는 것 같고, Guid 속성을 지정하지 않으면 DLL을 갱신하고 COM에 어셈블리 등록를 다시 행했을 때, 전회 등록한 어셈블리를 특정할 수 없어 갱신할 수 없는 에러가 된다 무늬.

    그 때의 오류 메시지는 다음과 같습니다.
    COM 相互運用機能に対して登録解除できる型を含んでいません。
    

    소스 외에도 Visual Studio 솔루션 탐색기에서 프로젝트의 Property 파일을 편집합니다.


  • 응용 프로그램 탭 > 어셈블리 정보 > 어셈블리를 COM 참조 가능으로 선택
  • 빌드 탭 > COM 상호 운용 기능 등록 확인

  • 관리자 권한으로 Visual Studio 2017을 시작하고 Release 빌드하면 프로젝트 폴더의 bin/Release에 세 개의 파일을 볼 수 있습니다.
  • MyClassLibrary.dll
  • MyClassLibrary.tlb
  • MyClassLibrary.pdb

  • 또, Visual Studio가 빌드의 과정에서 COM에 어셈블리 등록를 끝내 주는 모양.

    이것으로, DLL측의 준비는 완료.

    3. 호출측 VB6의 작업



    DLL로 빌드한 PC와 다른 PC로 행하는 경우에는 COM에 어셈블리 등록가 필요하게 된다.

    Visual Basic을 시작하고 빈 프로젝트를 만든 다음 메뉴에서 프로젝트 > 참조 설정을 선택합니다.



    참조 가능한 라이브러리 파일안에 등록한 dll가 있으므로 체크를 하고 [OK]를 선택한다.
    그렇지 않은 경우 찾아보기 버튼을 선택하고 MyClassLibrary.tlb를 선택하여 추가하고 확인합니다.



    이것으로 호출 측의 설정도 완료.

    4. VB6에서 호출 구현



    다음과 같은 코드를 써 DLL을 이용해 본다.
    Private Sub Form_Load()
        Dim MyMath As MyClassLibrary.MyMath
        Set MyMath = New MyClassLibrary.MyMath
        Label1.Caption = MyMath.Add(1, 2)
    End Sub
    

    참조 설정에 등록되어 있으면 보완 기능을 이용할 수 있다.



    인수의 형태도 변환되고 있다.

    .Net Framework의 int는 32bit이므로 VB6에서는 long이 된다.



    실행 결과는 다음과 같습니다.

    좋은 웹페이지 즐겨찾기