c# 으로 만든 dll 파일을 vb 6.0 에서 참조해서 쓰는 방법 질문이요

c# 에서 dll 파일을 아래와 같이 만들었습니다.

질문1
질문2
질문3

x와 y 값을 더하는 Sum 이라는 메소드를 만들고, 프로젝트 속성에 어셈블리 정보에서 “어셈블리를 COM에 노출” 을 체크 했고, 프로젝트 속성에 빌드에서 “COM Interop 등록” 을 체크 후에 빌드해서 DLL 파일과 TLB 파일을 생성 했습니다.

질문4

그리고나서 CMD(관리자모드 실행) 에서 위와 같이 DLL 과 TLB 파일을 레지스트리에 등록 했습니다.

질문5

그리고 위 사진에서 처럼 VB 6.0 에서 참조를 하고 코드를 작성 한 후 컴파일을 하면 “클래스를 찾을 수 없다” 는 메시지가 나오면서 컴파일이 되지가 않네요…

c# 으로 만든 DLL 파일을 vb 6.0 에서 참조해서 쓰려면 어떻게 해야할까요?

3 Likes

C# COM 만들기 글을 참고하세요.

2 Likes

일단 vb 6.0은 32비트 런타임이고, 닷넷에서 dll을 만들어 빌드할때는 64비트라서 서로 연결이 안될수 있습니다. 닷넷에서 빌드 타겟을 32비트로 명시적으로 빌드한 후에 COM 서버 등록을 하셔야 할겁니다.

3 Likes

링크 확인해서 해보겠습니다. 감사합니다!

3 Likes

답변 감사합니다! 알려주신대로 32비트로 빌드해서 해보겠습니다

3 Likes

알려주신대로 32비트로 빌드하고 나니 vb6.0 에서 적용이 잘 되는데요!!

그런데 인텔리센스가 적용이 안되던데 이 부분은 혹시 왜 그런걸까요?

Sum1 에서 . 을 누르면 해당 클래스의 메소드인 Sum() 이 나와야하는데,. 인텔리센스가 안되네요

3 Likes

알려주신 링크 글 따라하니 잘 되네요! 감사합니다!! 32비트 빌드가 중요했었네요…!

3 Likes

VB6 IDE에서 무엇을 토대로 인텔리센스 정보를 제공하는지 직접 확인해보거나 경험해본적은 없습니다만, 제 예상으로 타입 라이브러리 정보를 DLL에 리소스로 포함시키거나, TLB 파일을 따로 제공해주어야 인터페이스의 멤버가 무엇이 있는지를 판정할 수 있는 근거가 생길 것 같습니다.

별도의 CI/CD 파이프라인을 사용한다면, tlbexp.exe라는 .NET Framework SDK 상의 도구를 이용하거나, 아래 페이지를 참조하여 VB6 IDE가 사용할 TLB 파일을 자동 생성하도록 프로젝트 속성을 변경하는 방법을 쓸 수 있을 겁니다.

다만 이 방법은 .NET Framework 기준이고, .NET 5 이후에서는 생성 방법도 달라지고, 내부 런타임 메커니즘도 아주 다르기 때문에 .NET Core 계열로 나중에 옮겨간다면 미리 방법을 따로 찾아보셔야 합니다.

3 Likes

답변 감사합니다!! 검색을 통해서 해결 방법을 찾아냈습니다.

아래 코드에서 인터페이스에는
[InterfaceType(ComInterfaceType.InterfaceIsDual)]

이걸 선언해주고, 상속 받은 클래스에는
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(ISumTest))]

이 2개를 선언해주니 vb6.0 에서 c# 으로 만든 dll 참조했을 때 인텔리센스가 적용되네요!


namespace SumXY
{
    [Guid("24EE3F73-597C-4ADE-93C3-73EACAC116F4")]
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface ISumTest
    {
        void Sum(int x, int y, ref int z);
    }

    [Guid("7CFD3F5A-EEF5-42D7-BE9D-B5864F1505CA")]
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(ISumTest))]
    public class SumTest : ISumTest
    {          
        public void Sum(int x, int y, ref int z)
        {
            z = x + y;
        }
    }
}
2 Likes

@힘내쿠우 쿠우님!! 멋진 활동에 Markdown 활용법 까지지 익혀 보시면 너무 좋을 것 같습니다.

Markdown 기본 사용법 및 활용: 트렌디… : 네이버블로그 (naver.com)

소스코드와 설명 등을 더 가 독성 있게 작성하실 수 있습니다.

한번 읽어 보시겠어요?

그리고 지금까지 작성하셨던 글 내용도 한번 연습삼아 고쳐봐 주시면
앞으로 다른분들에게도 큰 도움 될 것 같습니다!!

1 Like

앗! 이런게 있었네요. 수정해놨습니다! 감사합니다

2 Likes