В чем разница между настройками Embed Interop Types true и false в Visual Studio?

121

В Visual Studio при добавлении одной ссылки в проект в окне свойств есть параметр Embed Inteop Types, следует ли установить его на Trueили False? Какая разница?

Так как у нас много проектов, среди некоторых из них была установлена ​​ссылка, для Falseдругих - все True, это совершенно беспорядочно. И сервер Bulid также имеет такие же предупреждения:

Что означает «ссылка была создана на встроенную сборку взаимодействия»?

Таким образом , мы планируем изменить все , Embed Inteop Typesчтобы False, какой риск мы хотели бы получить?

Джерри Биан
источник
4
Никогда не делайте этого, это отличная функция, которая решает утомительные детали развертывания. Вы должны понимать COM, чтобы по-настоящему понять, о чем идет речь.
Ханс Пассан
@HansPassant, вы говорите, что никогда не устанавливайте их falseили никогда не меняйте (например, если они falseуже установлены по умолчанию )?
noelicus
2
Он планирует установить значение False. Никогда не делай этого.
Ханс Пассан,
3
@HansPassant, почему вы используете надоедливый и грок. это очень по-британски: D
Mafii
4
@Mafii Я думал, что Grok был из "Незнакомца в чужой стране" (это американец). Конечно, это не значит, что британцы могут не использовать его больше!
UuDdLrLrSs

Ответы:

79

Эта опция была введена для того, чтобы избавиться от необходимости развертывать очень большие PIA (первичные сборки взаимодействия) для взаимодействия.

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

Подробнее в блоге Скотта Хансельмана об этом и других улучшениях VS здесь .

Что касается того, рекомендуется это или нет, я не уверен, поскольку мне не нужно использовать эту функцию. Быстрый поиск в Интернете дает несколько потенциальных клиентов:

Единственный риск превратить их все в ложные - это больше проблем с развертыванием файлов PIA и более масштабное развертывание, если некоторые из этих файлов большие.

Адам Хоулдсворт
источник
1
Обратите внимание, что существует довольно существенная разница, которая может нарушить существующий код при отключении Embed Interop Types . Разница упоминается здесь : «C # 4 и более поздние версии автоматически преобразуют возвращаемый объект в динамический, если на сборку ссылается параметр компилятора / link или, что эквивалентно, если для свойства Excel Embed Interop Types установлено значение true. True - это значение по умолчанию для этого свойства ».
Dirk Vollmar
Встроенные сборки взаимодействия доставляли мне проблемы в системе на основе подключаемых модулей, в которой и хост, и подключаемые модули зависели от одного и того же COM- объекта. Другой проблемой было объединение таких сборок с ILMerge .
Ant_222,
8

Я заметил, что когда для него установлено значение false, я могу видеть значение элемента с помощью отладчика. Когда было установлено значение true, я получал ошибку - item.FullName.GetValue. Встроенный тип взаимодействия «FullName» не содержит определения для «QBFC11Lib.IItemInventoryRet», так как он не использовался в скомпилированной сборке. Рассмотрите возможность приведения к объекту или изменение свойства Embed Interop Types на true.

user890332
источник