C#에서 VBA에서 열거할 수 있는 COM 개체 만들기

10969 단어 VBA.NETFrameworkC#

소개



C#에서 COM 구성 요소를 만들고 Microsoft Office 매크로에서 개체를 열거하고 싶다고 생각합니다.

COM 코드



.NET 클래스 라이브러리로 프로젝트를 만들고 응용 프로그램 > 어셈블리 정보의 For Each...다음 및 빌드 > 출력에 어셈블리를 COM 참조 가능하게 만들기 을 활성화합니다. GUID 값은 도구로 생성됩니다. 관리자로 Visual Studio를 실행하고 빌드하면 그 과정에서 COM을 등록해 줍니다. 우도도 "COM 컴포넌트를 C#으로 작성하자"고 생각하고있는 전문가들에게는 COM에 대한 자세한 설명을 말할 필요가 없을 것입니다 ...
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace MyCOM
{
    [Guid("1???????-????-????-????-????????????")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IPerson
    {
        string FirstName { get; }
        string LastName { get; }
        int Age { get; }
        string GetInfo();
    }

    [Guid("2???????-????-????-????-????????????")]
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(IPerson))]
    public class Person : IPerson
    {
        public string FirstName { get; }
        public string LastName { get; }
        public int Age { get; }

        public Person(string firstName, string lastName, int age)
        {
            FirstName = firstName;
            LastName = lastName;
            Age = age;
        }

        public string GetInfo() {
            return string.Format("{0} {1} ({2})", FirstName, LastName, Age);
        }
    }

    [Guid("3???????-????-????-????-????????????")]
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)]
    public interface IPersons : IEnumerable
    {
        new IEnumerator GetEnumerator();
    }

    [Guid("4???????-????-????-????-????????????")]
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(IPersons))]
    public class Persons : IPersons
    {
        System.Collections.Generic.List<Person> _data = new List<Person>();
        public Persons()
        {
            // SAMPLE DATA
            _data.Add(new Person("なまえ", "みょうじ", 20));
            _data.Add(new Person("名前", "苗字", 21));
        }

        public IEnumerator GetEnumerator()
        {
            return _data.GetEnumerator();
        }
    }
}

생성 된 객체의 유형



COM 상호 운용 기능 등록
(비 제네릭 쪽)은 System.Collections.IEnumerator 을 자동으로 구현해주는 것 같습니다.

이용 예



엑셀이나 워드의 매크로로부터 호출해 봅니다. 참조 설정을 잊지 않고 ...
Sub Sample()
'
' Sample Macro
'
'
    Dim persons As New MyCOM.persons
    Dim item As MyCOM.Person

    For Each item In persons
        MsgBox item.GetInfo()
    Next
End Sub


IEnumVARIANT

참고 사이트(감사!)



  • - LIM BIO LIONG

  • Exposing an Enumerator from Managed Code to COM - EternalWindows
  • 좋은 웹페이지 즐겨찾기