Почему атрибут GUID нужен в первую очередь?

В чем заключается необходимость в атрибуте GUID? почему бы просто не позволить компилятору обрабатывать это автоматически?!

Ответы

Ответ 1

Если компилятор обработает это автоматически, вы получите одну из двух ситуаций.

  • Новый GUID каждый раз, когда вы компилируете - поскольку предполагается, что GUID должны быть опубликованы, это не сработает.

  • Коллизии - если GUID был одинаковым каждый раз, на основе (скажем) хеширования имени, несколько проектов в конечном итоге используют один и тот же идентификатор GUID для разных целей.

Существующий подход - явный GUID дает разработчикам возможность контролировать их по мере необходимости.

Ответ 2

Это атрибуты, которые очень важны для COM. Это был предшественник .NET и имел его расцвет в девяностые годы, прежде чем Java украла шоу..NET должен быть совместим с COM, чтобы иметь шанс преуспеть. Или, другими словами, вам нужно было написать COM-сервер на языке .NET, который могла бы использовать большая устаревшая программа.

Атрибут [ComVisible] гарантирует, что клиентская программа COM может видеть и использовать интерфейс IEnumerable. Необходимо, чтобы клиентская программа могла перечислять коллекции .NET.

Атрибут [Guid] имеет решающее значение в COM, он идентифицирует интерфейс. Это делается руководством, а не именем, чтобы гарантировать, что он уникален для нескольких приложений, написанных разными программистами..NET тоже имеет это, но, однако, использует имя, чтобы сделать его проще для людей. "System.Collections.IEnumerable, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089".

IEnumerable < > , общая версия, не имеет [Guid]. Дженерики несовместимы с COM. В наши дни это не так уж и важно, не так много видимого COM-интерфейса, большинство из них было обернуто дружественными .NET-классами. Но все еще очень ядро ​​в Windows, особенно в совершенно новом WinRT (aka Metro). Вы также не используете это напрямую, делая COM несколько похожим на язык ассемблера программирования Windows.

Ответ 3

Вы можете сделать это (просто опустить атрибут), но тогда компилятор будет генерировать новый GUID для каждой перекомпиляции, даже если интерфейс не изменился. Это несчастливо, потому что пользователи этого интерфейса не знают об изменениях и получат интерфейс с помощью старого GUID и поэтому не смогут его восстановить.

Ответ 4

Иногда вы хотите дать определенным классам или модулям уникальный идентификатор, который является постоянным и жестко закодированным внутри вашего источника.

Ответ 5

Чтобы прочитать это определение, вам нужно будет изучить смысл каждого из этих атрибутов. Первый, ComVisibleAttribute, описывается следующим образом:

Управляет доступом к COM-интерфейсу отдельного управляемого типа или элемента или всех типов внутри сборки.

Это говорит нам о том, что ComVisible имеет какое-то отношение к COM, и позволяет нам указать, является ли конкретный тип видимым для COM-программ. Далее на странице приведена ссылка на более подробную информацию о том, для какого атрибута и как его используется экспортером библиотеки типов.

Второй, GuidAttribute, сначала немного менее полезен:

Поставляет явный System.Guid, когда автоматический GUID нежелателен

но опять же, вы должны прочитать остальную часть пути вниз, и вы увидите другое упоминание экспортера библиотеки типов.

Объединяя эти два элемента, становится ясно, что эти два атрибута управляют обработкой IEnumerator при экспорте в библиотеку типов. Если вы не знаете, что такое библиотека типов, это, вероятно, мало что значит для вас. Если вы не используете COM-взаимодействие, эти атрибуты можно безопасно игнорировать. Если вы используете COM-взаимодействие, вам нужно знать Guid для правильного доступа к интерфейсу из неуправляемого COM-кода.

Microsoft помещает их в каждое определение интерфейса в случае необходимости; часть навыков чтения страниц MSDN - распознавать этот тип информации и знать, когда она вам не подходит. Теперь, когда вы знаете, для чего предназначены эти два атрибута, вы должны знать, насколько они важны для вас, и игнорировать их в противном случае.