Подтвердить что ты не робот

Есть ли смысл указывать Guid при использовании ComVisible (false)?

Когда вы создаете новый проект С# в Visual Studio, сгенерированный файл AssemblyInfo.cs содержит атрибут, указывающий GUID сборки. Комментарий над атрибутом гласит, что он используется "если этот проект открыт для COM".

Ни одна из моих сборок не содержит типов, которые должны быть видимы для COM, поэтому я пометил свою сборку с помощью [assembly: ComVisible(false)]. Так есть ли смысл указывать GUID?

Мне кажется, что ответ "нет" - так почему файл AssemblyInfo.cs по умолчанию содержит как [assembly: ComVisible(false)] и [assembly: Guid("...")] [assembly: ComVisible(false)] [assembly: Guid("...")]?


Редактировать:

Подводя итоги ответов:

Между ними ответы объясняют, что указание GUID требуется тогда и только тогда, когда используется COM-взаимодействие. Так что в моей ситуации GUID не нужен.

Кроме того, sharptooth объясняет, что [assembly: ComVisible(false)] не означает, что COM-взаимодействие не используется, так как можно переопределить ComVisible для отдельных типов. По этой причине файл AssembyInfo.cs по умолчанию содержит как [assembly: ComVisible(false)] и GUID.

4b9b3361

Ответ 1

Наличие [assembly: ComVisible(false)] и [assembly: Guid("...")] одновременно имеет смысл в некоторых случаях. Вы начинаете с пустой сборки и, возможно, захотите открыть что-то из нее для COM. Таким образом, вы помечаете сборку как не ComVisible а позже помечаете сущности для предоставления как ComVisible. Вот почему GUID существует по умолчанию.

В любом случае, если вы действительно не хотите открывать COM для своей сборки, оставьте флажок "Зарегистрироваться для взаимодействия COM" в настройках проекта.

Ответ 2

Согласованные идентификаторы GUID абсолютно необходимы в COM. Атрибут [assembly: Guid] генерирует LIBID библиотеки типов. Разумеется, шаблон проекта автоматически генерирует его, чтобы убедиться, что программист не забывает предоставить его, когда он/она переводит ComVisible в true.

Если сборка [Guid] не указана, то Tlbexp.exe синтезирует один из имени, версии и открытого ключа сборки. Это не очень хорошо, библиотеки типов уже имеют версию. Изменение [AssemblyVersion] создало бы другой LIBID. Особенно плохо, если вы используете опцию автоматического инкремента для версии (например, 1.0. *), Вы можете быстро заполнить реестр горными мертвыми ключами реестра TypeLib.

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

Ответ 3

Нет, нет реальной причины его включить. Это действительно довольно ненужно, за исключением очень специфических сценариев взаимодействия COM. Хотя я полагаю, что может быть что-то полезное в том, что у вас есть GUID, с которым вы можете получить доступ с отражением. Но поскольку он не гарантированно был там, его не так, как вы могли бы положиться на него.