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

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

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

Interop type "ActiveHomeScriptLib.ActiveHomeClass" ne peuvent pas être intégrés. Utiliser les interface à la place.

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

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

592
demandé sur Peter Mortensen 2010-03-20 18:47:01

9 réponses

.NET 4.0 permet aux assemblages interop primaires (ou plutôt, les bits de celui-ci dont vous avez besoin) d'être intégré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 n'est pas un problème pour vous. Il suffit d'ouvrir l'onglet Propriétés pour l'assemblage dans Visual Studio 2010 et de mettre "Embed Interop Types" à "False".

EDIT: Voir Aussi answer , en supprimant le suffixe Class des types que vous utilisez.

952
répondu Jon Skeet 2017-05-23 12:10:42

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

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

typiquement, dans .NET 4 Vous avez juste besoin de supprimer le suffixe 'Class' et compiler le code:

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

une explication MSDN est ici .

443
répondu Michael Gustus 2015-06-03 19:54:15

comme Jan, ça m'a pris du temps pour l'avoir .. C'est le cas pour tous ceux qui sont aveuglés par la frustration.

  • clic droit l'assemblage offensant que vous avez ajouté dans la Solution explorer sous votre projet références . (Dans mon cas WIA)
  • cliquez Propriétés.
  • Et il devrait y avoir l'option pour Embed Assembly Interop.
  • Faux
102
répondu gideon 2012-01-19 09:12:46

développant la réponse correcte 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 fonctionnalité "Embed Interop Types" fonctionne essentiellement en reliant statiquement dans tous les types D'une PIA (Primary Interop Assembly) à l'assemblage de référence en supprimant le surplace de son déploiement.

cette fonctionnalité fonctionne très bien pour la plupart des types dans une PIA, mais il n'a pas restriction. L'un d'eux est que vous ne pouvez pas intégrer des classes (c'est un problème de service). Misha a un article de blog détaillé sur pourquoi ce n'est pas permis

32
répondu JaredPar 2010-03-20 17:42:41

Voici comment définir le Embed Interop dans Visual Studio 2012

enter image description here

24
répondu VK_217 2017-04-27 01:34:01

a Obtenu la solution

allez à Références right click la dll désirée vous obtiendrez l'option" Embed Interop Types "à" False "ou"True".

12
répondu Navdeep 2015-09-03 11:14:03

j'ai rencontré ce problème en tirant vers le bas un projet TFS à ma machine locale. Apparemment, ça marchait très bien sur la machine du gars qui l'a écrit. J'ai simplement changé de cette...

WshShellClass shellClass = new WshShellClass();

à ceci...

WshShell shellClass = new WshShell();

maintenant, ça marche comme un champion!

9
répondu Zach 2016-01-12 15:34:54

j'ai eu le même problème en VB.NET 2013 avec Office 2007, et cela résolu:

VS 2013 VB.NET Projet > Accessoires > Références > Microsoft Word 12.0 Objet Lib > Incorporer les Types Interop: changement de True à False

2
répondu Doug Null 2014-10-04 14:23:12

http://digital.ni.com/public.nsf/allkb/4EA929B78B5718238625789D0071F307

cette erreur se produit parce que la valeur par défaut est vraie pour la propriété Embed Interop Types de L'ensemble Interop API TestStand référencé dans le nouveau projet. Pour corriger cette erreur, changez la valeur de la propriété Embed Interop Types en False en suivant ces étapes: Sélectionnez la référence D'assemblage Interop de TestStand dans la section Références de votre projet dans l'Explorateur de solutions. Trouvez la propriété Embed Interop Types dans le navigateur de propriétés, et changez la valeur en False

1
répondu Ramezani r 2013-06-10 07:57:12