web-dev-qa-db-fra.com

Le type d'interopérabilité 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", le message d'erreur suivant s'affiche:

Le type d'interopérabilité 'ActiveHomeScriptLib.ActiveHomeClass' ne peut pas être incorporé. Utilisez l'interface applicable à la place.

Lorsque je modifie le framework à la version 3.5, je n'ai aucune erreur.

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

632
Jan

.NET 4.0 permet aux assemblages d'interopérabilité principaux (ou plutôt aux éléments dont vous avez besoin) d'être incorporés dans votre assemblage afin que vous n'ayez pas besoin de les déployer le long de votre application.

Pour une raison quelconque, cette Assemblée ne peut pas être intégrée - mais il semble que cela ne vous pose pas de problème. Ouvrez simplement l'onglet Propriétés pour l'assemblage dans Visual Studio 2010 et définissez "Intégrer les types d'interopérabilité" sur "Faux".

EDIT: Voir aussi answer de Michael Gustus, supprimant le suffixe Class des types que vous utilisez.

1010
Jon Skeet

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 qui démarre Excel:

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

En règle générale, dans .NET 4, il vous suffit de supprimer le suffixe "Classe" et de compiler le code:

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

Une explication MSDN est ici .

460
Michael Gustus

Comme Jan Il m'a fallu un certain temps pour l'obtenir .. = S Donc pour quiconque aveuglé par la frustration.

  • Cliquez avec le bouton droit de la souris sur l'assemblage incriminé que vous avez ajouté dans l'explorateur de solutions sous votre projet Références. (Dans mon cas, WIA)
  • Cliquez sur les propriétés.
  • Et il devrait y avoir l'option là pour Embed Interop Assembly.
  • Définissez-le sur False
113
gideon

Développer 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 fonction "Types d'interopérabilité incorporés" fonctionne essentiellement en liant statiquement tous les types d'un assemblage d'interopérabilité primaire (PIA) à l'assembly de référence, ce qui supprime la surcharge de son déploiement.

Cette fonctionnalité fonctionne très bien pour la plupart des types dans une PIA, mais elle comporte des restrictions. L'une d'elles est que vous ne pouvez pas intégrer de classes (c'est un problème de maintenance). Misha a publié un article de blog détaillé expliquant pourquoi cela n'est pas autorisé

32
JaredPar

Voici où définir l'interopérabilité incorporée dans Visual Studio 2012

enter image description here

29
VK_217

Vous avez la solution

Accédez aux références cliquez avec le bouton droit de la souris sur la dll souhaitée. L'option "Intégrer les types d'interopérabilité" est définie sur "False" ou "True".

12
Navdeep

Je me suis heurté à ce problème en déposant un projet TFS sur ma machine locale. Il semblerait que cela fonctionnait bien sur la machine du type qui l'a écrit. J'ai simplement changé ça ...

WshShellClass shellClass = new WshShellClass();

Pour ça...

WshShell shellClass = new WshShell();

Maintenant, ça marche comme un champion!

9
Zach

J'ai eu le même problème dans VB.NET 2013 avec Office 2007 et cela l'a résolu:

Projet VB.NET VS 2013> Accessoires> Références> Bibliothèque d'objets Microsoft Word 12.0> Types d'interopérabilité incorporés: remplacez True par False

2
Doug Null

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

Cette erreur se produit car la valeur par défaut est true pour la propriété Embed Interop Types de l'assembly Interop API TestStand référencé dans le nouveau projet. Pour résoudre cette erreur, remplacez la valeur de la propriété Embed Interop Types par False en procédant comme suit: Sélectionnez la référence Assembly Interop TestStand dans la section références de votre projet dans l'explorateur de solutions. Recherchez la propriété Incorporer les types d'interopérabilité dans le navigateur de propriétés et définissez la valeur sur False.

1
Ramezani r

Visual Studio 2017 version 15.8 a rendu possible l'utilisation de PackageReferencesyntax pour référencer les packages NuGet dans les projets Visual Studio Extensibility (VSIX). Cela simplifie beaucoup le raisonnement à propos des paquets NuGet et ouvre la porte à un méta-paquet complet contenant la totalité du VSSDK.

L’installation au-dessous du paquet NuGet résoudra le problème EmbedInteropTypes .

Package d'installation Microsoft.VisualStudio.SDK.EmbedInteropTypes

0
Rahul