Question Le type Interop ne peut pas être intégré


Je crée une application web sur le framework .NET 4.0 (beta2) en C #.

Lorsque j'essaie d'utiliser un assembly appelé "ActiveHomeScriptLib", j'obtiens l'erreur suivante:

Type d'interopérabilité   'ActiveHomeScriptLib.ActiveHomeClass'   ne peut pas être intégré. Utilisez le applicable   interface à la place.

Lorsque je change le framework en version 3.5, je n'ai aucune erreur.

Qu'est-ce qu'un type Interop et pourquoi cela se produit uniquement lorsque j'utilise le framework 4.0?


580
2018-03-20 15:47


origine


Réponses:


.NET 4.0 permet aux assemblages d'interopérabilité primaires (ou plutôt, les bits dont vous avez besoin) d'être incorporés dans votre assemblage, de sorte que vous n'avez pas besoin de les déployer à côté de votre application.

Pour quelque raison que ce soit, cet assemblage ne peut pas être intégré - mais il semble que ce ne soit pas un problème pour vous. Ouvrez simplement l'onglet Propriétés de l'assembly dans Visual Studio 2010 et définissez "Embed Interop Types" sur "False".

EDIT: Voir aussi Michael Gustus répondre, enlever le Class suffixe des types que vous utilisez.


935
2018-03-20 15:54



Dans la plupart des cas, cette erreur est le résultat du code qui essaie d'instancier un objet COM. Par exemple, voici un morceau de code démarrant Excel:

Excel.ApplicationClass xlapp = new Excel.ApplicationClass();

En règle générale, dans .NET 4, vous devez simplement supprimer le suffixe 'Class' et compiler le code:

Excel.Application xlapp = new Excel.Application();

Une explication MSDN est ici.


437
2017-12-29 10:47



Comme Jan Il m'a fallu un certain temps pour l'obtenir .. = S Donc pour quelqu'un d'autre qui est aveuglé par la frustration.

  • Cliquez avec le bouton droit sur l'assembly incriminé que vous avez ajouté dans l'explorateur de solution sous votre projet Les références. (Dans mon cas WIA)
  • Cliquez sur les propriétés.
  • Et il devrait y avoir l'option là pour Intégrez l'assembly interop.
  • Réglez-le sur False

101
2017-07-23 16:31



Expansion de la bonne réponse de Jon

Le problème ici est que vous combinez la nouvelle fonctionnalité "Embed Interop Types" (ou NoPIA) avec l'utilisation d'un type de classe. La fonction "Embed Interop Types" fonctionne essentiellement en reliant statiquement tous les types d'un assembly PIA (Primary Interop Assembly) dans l'assembly de référencement en supprimant le surcoût de son déploiement.

Cette fonctionnalité fonctionne très bien pour la plupart des types dans un PIA mais elle a des restrictions. L'un d'eux est que vous ne pouvez pas intégrer des classes (c'est un problème de maintenance). Misha a un article de blog détaillé sur les raisons pour lesquelles cela n'est pas autorisé


31
2018-03-20 17:42



Voici où placer Embed Interop dans Visual Studio 2012

enter image description here


22
2017-10-24 15:45



J'ai la solution

Aller aux références faites un clic droit sur la DLL souhaitée, vous obtiendrez l'option "Embed Interop Types" à "False" ou "True".


12
2017-07-11 14:37



J'ai rencontré ce problème lors de l'extraction d'un projet TFS sur ma machine locale. Apparemment, ça fonctionnait très bien sur la machine du gars qui l'a écrit. J'ai simplement changé ça ...

WshShellClass shellClass = new WshShellClass();

Pour ça...

WshShell shellClass = new WshShell();

Maintenant, ça fonctionne comme un champion!


8
2018-01-12 15:34