Quelle est la différence entre le paramètre Embed Interop Types true et false dans Visual Studio?

121

Dans Visual Studio, lors de l'ajout d'une référence au projet, la fenêtre des propriétés a une option Embed Inteop Types, devons-nous la définir sur Trueou False? Quelle est la différence?

Puisque nous avons beaucoup de projets, parmi certains, il a été fait référence à False, d'autres ont été mis en place True, c'est totalement gâché. Et le serveur bulid a également les mêmes avertissements:

Que signifie «référence a été créée à l'assemblage d'interopérabilité intégré»?

Nous avons donc l' intention de changer tout le Embed Inteop Typespour False, quel risque irions - nous?

Jerry Bian
la source
4
Ne faites jamais cela, c'est une fonctionnalité très impressionnante qui résout les détails de déploiement ennuyeux. Vous devez comprendre COM pour vraiment comprendre de quoi il s'agit.
Hans Passant
@HansPassant, dites-vous de ne jamais les définir falseou de ne jamais les modifier (par exemple, s'ils sont falsedéjà par défaut )?
noelicus
2
Il prévoit de le définir sur False. Ne fais jamais ça.
Hans Passant
3
@HansPassant comment se fait-il que vous utilisiez ennuyeux et grok. c'est très brittish: D
Mafii
4
@Mafii Je pensais que grok venait de Stranger in a Strange Land (qui est américain). Cela ne veut pas dire que les Britanniques pourraient ne pas l'utiliser davantage, bien sûr!
UuDdLrLrSs

Réponses:

79

Cette option a été introduite afin de supprimer le besoin de déployer de très grands PIA (Primary Interop Assemblies) pour l'interopérabilité.

Il incorpore simplement le code de pontage géré utilisé qui vous permet de parler à des assemblys non gérés, mais au lieu de tout incorporer, il ne crée que les éléments que vous utilisez réellement dans le code.

Pour en savoir plus, consultez l'article de blog de Scott Hanselman à ce sujet et d'autres améliorations VS ici .

Quant à savoir si cela est conseillé ou non, je ne suis pas sûr car je n'ai pas besoin d'utiliser cette fonctionnalité. Une recherche rapide sur le Web donne quelques pistes:

Le seul risque de les transformer tous en faux est davantage de problèmes de déploiement avec les fichiers PIA et un déploiement plus important si certains de ces fichiers sont volumineux.

Adam Houldsworth
la source
1
Notez qu'il existe une différence assez significative qui peut casser le code existant lors de la désactivation des types d'interopérabilité incorporés . La différence est mentionnée ici : «C # 4 et les versions ultérieures convertissent automatiquement l'objet renvoyé en dynamique si l'assembly est référencé par l'option du compilateur / link ou, de manière équivalente, si la propriété Excel Embed Interop Types est définie sur true. True est la valeur par défaut de cette propriété. »
Dirk Vollmar
Les assemblys d'interopérabilité intégrés m'ont posé des problèmes dans un système basé sur des plug-ins, dans lequel l'hôte et les plugins dépendaient du même objet COM . Un autre problème était la fusion de ces assemblys avec ILMerge .
Ant_222
8

J'ai remarqué que lorsqu'il est défini sur false, je peux voir la valeur d'un élément à l'aide du débogueur. Lorsqu'il était défini sur true, j'obtenais une erreur - item.FullName.GetValue Le type d'interopérabilité intégré 'FullName' ne contient pas de définition pour 'QBFC11Lib.IItemInventoryRet' car il n'a pas été utilisé dans l'assemblage compilé. Envisagez de convertir en objet ou de changer la propriété "Embed Interop Types" sur true.

user890332
la source