#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")] - Это задает уникальный идентификатор. Он уникален вообще всегда.(теоретически и практически). Он служит для однозначного определения любых объектов. Эти атрибуты вам не нужны. Рискуете зависнуть на очень долго. СОМ менялся много раз. Пока пропускайте их мимо.
Комментариев нет:
Отправить комментарий