Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Для чего нужны атрибуты ComVisible и DispId?

#net #windows #com


Хочу спросить насчет интерфейса IEnumerable, который как я понял используется при
работе с коллекциями(я их только начал изучать), но тема не о коллекциях, а о содержимом
вышеупомянутого интерфейса:

namespace System.Collections
{
    // Сводка:
    //     Предоставляет перечислитель, который поддерживает простой перебор элементов
    //     неуниверсальной коллекции.
    [ComVisible(true)]
    [Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
    public interface IEnumerable
    {
        // Сводка:
        //     Возвращает перечислитель, осуществляющий итерацию в коллекции.
        //
        // Возвращает:
        //     Объект System.Collections.IEnumerator, который может использоваться
для перебора
        //     коллекции.
        [DispId(-4)]
        IEnumerator GetEnumerator();
    }
}


Итак, по порядку, что мне не понятно:
строка 

[ComVisible(true)]


как дает определение Visual Studio, когда навожу курсор настроку:
** class System.Runtime.InteropServices.ComVisibleAttribute
Управляет доступгостьб отдельног управляемого типа или члена или всех типов в сборке
для COM **
Итак, вопросы в студию:

InteropServices - ?
COM - это что вообще ?
ComVisibleAttribute - ?
что за ComVisible 

[ComVisible(true)]- какую роль он выполняет


Управляемый тип\член ?

Далее: 

[DispId(-4)]


Опять же, определение Visual Studio
** class System.Runtime.InteropServices.DispldAttribute
Задает идентификатор диспетчирезации COM(DISPID) для метода, поля или свойства. **

идентификатор диспетчирезации COM(DISPID) - что!?

диспетчирезация COM - ?

DISPID - ?

И значит захожу я в этот 

[DispId(-4)]


А там вот такое:

public sealed class DispIdAttribute : Attribute
{
    // Сводка:
    //     Инициализирует новый экземпляр класса DispIdAttribute, используя указанный
    //     идентификатор DISPID.
    //
    // Параметры:
    //   dispId:
    //     Идентификатор DISPID для этого члена.
    public DispIdAttribute(int dispId);

    // Сводка:
    //     Возвращает идентификатор DISPID для члена.
    //
    // Возвращает:
    //     Идентификатор DISPID для этого члена.
    public int Value { get; }
}


и как я понял, этот 

[DispId(-4)]


- это конструктор класса DispIdAttribute ?

Умоляю дать подробный и развернутый ответ, без вот этого : "там есть некие механизмы,
но так как ты сейчас только начал учить коллекции, то тебе это будет не нужно и даже
мешать" - поверьте, мне нужно все. Отвечать на вопросы можно, даже нужно так, что бы
эти разрозненные вопросы в итоге сформировали один комплексный ответ.
    


Ответы

Ответ 1



Для начала, есть такая штука — COM (почитайте про неё, есть много книг). Это стандарт для взаимодействия модулей на разных языках. Сборки C# также поддерживают этот стандарт по желанию (вы можете включить в свойствах сборки), так что .NET-объекты могут быть использованы как COM-объекты, и таким образом — различными нативными приложениями, а также скриптовыми языками (например, javascript). Да, так [ComVisible(true)] означает, что интерфейс будет виден самой подсистеме COM, а значит, если ваш метод возвращает IEnumerable, то его результатом можно воспользоваться при помощи COM. Базовыми интерфейсами в COM являются IUnknown и IDispatch. Последний из них особенно важен для скриптов, т. к. позволяет вызывать метод по строковому имени. DispID есть специальный атрибут для того, чтобы .NET мог сделать автоматическую имплементацию IDispatch. Да, а если ваша программа не экспортирует COM-объекты, и не работает со скриптами, то скорее всего вам всё равно, и вы можете спокойно эти атрибуты игнорировать. Если ваша программа полностью на .NET, COM-атрибуты не важны для вас.

Ответ 2



Дам несколько частичный ответ [ComVisible(true)] - Всё что в таких скобках перед классами, структурами, методами и атрибутами - это дополнительные атрибуты (Custom Attributes). Это прописано в языке C#. Упрощенно можно сказать, что создается экземпляр класса атрибута при выполнении кода. Т.е. в вашем случае выполняется конструктор ComVisible(true); Обратите внимание, что сам класс будет называться ComVisibleAttribute - т.е. с добавлением слова Attribute. Этого требует C#. Технология COM -это такое средство взаимодействия между программами и библиотеками написанными на самых разных языках. Технология большая сама по себе. Книги есть отдельные. Эти атрибуты класса ComVisibleAttribute как раз и управляют поведением взаимодействия между двумя программами, использующими COM технологию. Вообще dll в Винде написаны с помощью COM. InteropServices - всего лишь пространство имен в котором содержится класс ComVisibleAttribute. Вы такое используете когда пишите namespace. [DispId(-4)] вызовет конструктор класса public sealed class DispIdAttribute : Attribute с параметром -4. Реализация класса для вас скрыта, поэтому что там дальше посмотреть скорее всего не получится. [Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")] - Это задает уникальный идентификатор. Он уникален вообще всегда.(теоретически и практически). Он служит для однозначного определения любых объектов. Эти атрибуты вам не нужны. Рискуете зависнуть на очень долго. СОМ менялся много раз. Пока пропускайте их мимо.

Комментариев нет:

Отправить комментарий