Реализация класса C # в COM - обработка пользовательских свойств - PullRequest
0 голосов
/ 19 сентября 2019

Я конвертирую некоторый код VB6 в C #, и он должен быть видимым для COM.У меня есть класс коллекции, который реализует IEnumerator и IEnumerable, и это успешно работает из COM-клиента, если я создаю экземпляр этого класса.

Set test = CreateObject("Application.Children")
test.Load(parentID)
Print test.Count

Теперь этот класс также предоставляется как свойство другого класса

interface IParent
{
    string Name {get;}
    Children AllKids {get;}
}
class Parent : IParent
{
    private Children _children;
    private string _parentName;
    public Children AllKids {get => _children}
    public string Name {get => _parentName};
}

Однако, когда я пытаюсь проверить это из COM-клиента

set test = CreateObject("Application.Parent")
test.Load(parentID)
Print test.AllKids.Count

Я получаю ошибку

"Объект не поддерживает это свойствоили метод: 'test.AllKids.Count' "

Интерфейс Children правильно представлен для COM с собственным интерфейсом (IChildren), как и класс Parent.

Короче говоря, если COM создает экземпляр класса Children, у меня есть доступ к свойствам и функциям этого класса, но если я пытаюсь получить доступ к этому классу из экземпляра Parent, я не могу.

У кого-нибудь есть идеи?

РЕДАКТИРОВАТЬ: - Я добавил класс Children ниже, хотя еще не все методы, требуемые интерфейсом, написаны.

public class Children: IMyCollection<IChild>
    {
        private List<IChild> _baseCollection = new List<IChild>();
        protected int _position = 0;

        public int Count => _baseCollection.Count;

        public IChild Current => _baseCollection[_position];

        public void Add(IChild newItem)
        {
            _baseCollection.Add(newItem);
        }

        public void Clear()
        {
            _baseCollection.Clear();
        }

        public bool Contains(IChild item)
        {
            throw new NotImplementedException();
        }

        public void CopyTo(IChild[] array, int arrayIndex)
        {
            throw new NotImplementedException();
        }

        public IEnumerator GetEnumerator()
        {
            return new Enumerator<IChild>(_baseCollection);
        }

        public bool MoveNext()
        {
            _position++;
            return (_position < _baseCollection.Count);
        }

        public bool Remove(IChild item)
        {
            throw new NotImplementedException();
        }

        public void Reset()
        {
            _position = 0;
        }

1 Ответ

0 голосов
/ 19 сентября 2019

Похоже, я (более или менее) разобрал проблему.

Мой IMyCollection<IChild> интерфейс унаследовал другие интерфейсы, и кажется, что это наследование вызывало проблемы.После того, как я переработал этот интерфейс, проблема, кажется, решена, и все работает как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...