Le type d'interopérabilité ne peut pas être intégré

668

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:

Le type d'interopérabilité 'ActiveHomeScriptLib.ActiveHomeClass' ne peut pas être incorporé. Utilisez plutôt l'interface applicable.

Lorsque je change le framework en 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?

Jan
la source
J'ai trouvé cet article très utile pour résoudre les problèmes d'interopérabilité / PIA. blogs.msdn.com/b/vbteam/archive/2010/06/11/…
GilesDMiddleton

Réponses:

1069

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

Pour une raison quelconque, 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 "Incorporer les types d'interopérabilité" sur "Faux".

EDIT: Voir également la réponse de Michael Gustus , supprimant le Classsuffixe des types que vous utilisez.

Jon Skeet
la source
2
Malheureusement, cela ressemble à ce dont j'ai besoin, mais cette propriété ne semble plus être disponible.
Dave
130
Je cherchais dans la page de propriétés du projet au lieu du clic droit | Propriétés sur la DLL effectuée dans le volet Références.
justSteve
5
Ne serait-il pas plus logique de faire comme le dit l'erreur et "d'utiliser l'interface applicable"? J'ai eu cette erreur (d'une classe différente) et j'ai pu instancier une interface qui avait cette classe spécifiée comme attribut CoClass, et cela a fonctionné. Comme dans la réponse de Michael Gustus ci-dessous, l'interface pour BlahClass s'appelait simplement Blah, ce qui semble être la convention standard.
Tim Goodman
1
Une grande chose à propos de l'incorporation est que l'assembly Interop peut rester CopyLocal = False, car vous n'en avez pas besoin au moment de l'exécution.
Schmuli
@TimGoodman pour moi "l'interface applicable" ne fonctionnait pas, mais la définition de la embed interop typespropriété mentionnée ci-dessus a falsefait l'affaire. Dans mon cas - je travaillais avec la Microsoft.Office.Interop.Excelbibliothèque et j'avais besoin d'accéder à l'objet Workbook. Utiliser son interface Workbook(en fait. Convention de dénomination ...) n'était pas une option - j'ai reçu COM object, pas ce que je voulaisMicrosoft.Office.Interop.Excel.WorkbookClass
Prokurors
485

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

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

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

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

Une explication MSDN est ici .

Michael Gustus
la source
16
+1 Je crois que c'est ce que le message d'erreur vous dit réellement de faire quand il dit "utilisez l'interface applicable". Notez que Excel.Application est une interface (malgré le fait qu'elle peut être instanciée avec le nouveau mot clé, similaire à la situation décrite ici: stackoverflow.com/questions/6960910/… )
Tim Goodman
"Intégrer les types d'interopérabilité" à "Faux" ou "Vrai" ?
Kiquenet
1
@Kiquenet si vous suivez les conseils ici, vous pouvez redéfinir les `` types d'interopérabilité intégrés '' sur True, ou du moins cela a fonctionné pour moi
Sam Holder
122

Comme Jan Il m'a fallu un certain temps pour l'obtenir .. = S Donc pour tous ceux qui sont aveuglés par la frustration.

  • Cliquez avec le bouton droit sur l'assembly incriminé que vous avez ajouté dans l'explorateur de solutions sous les références de votre projet . (Dans mon cas WIA)
  • Cliquez sur propriétés.
  • Et il devrait y avoir l'option pour Embed Interop Assembly.
  • Réglez-le sur False
gideon
la source
15
Encore du mal jusqu'à ce que je réalise que vous deviez cliquer avec le bouton droit sur l'assembly d'interopérabilité sous le projet Références dans l'Explorateur de solutions, PAS l'assembly que vous construisez!
SteveWilkinson
2
Maintenant, (dix ans plus tard), cette option est appelée "Embed Interop Types"
David Foley
36

Voici où définir l'interopérabilité d'intégration dans Visual Studio 2012

entrez la description de l'image ici

VK_217
la source
34

Développant 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 fonctionnalité "Intégrer les types d'interopérabilité" fonctionne en reliant essentiellement statiquement tous les types d'un PIA (assemblage d'interopérabilité principal) à l'assemblage de référence, ce qui supprime la surcharge de 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 de 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é

JaredPar
la source
15

Vous avez la solution

Allez dans les références, faites un clic droit sur la DLL souhaitée, vous obtiendrez l'option "Intégrer les types d'interopérabilité" à "Faux" ou "Vrai".

Navdeep
la source
1
Cela a également fonctionné pour VS2015 c # avec .net en utilisant PP_COM_Wrapper; donné dans cypress.com Cypress Semiconductor Corporation, exemple C # Lib. La définition de False a permis de supprimer l'erreur.
user3564895
9

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

WshShellClass shellClass = new WshShellClass();

Pour ça...

WshShell shellClass = new WshShell();

Maintenant, cela fonctionne comme un champion!

Zach
la source
1
Cette approche a également fonctionné pour moi! Dans mon cas, je déboguais pour trouver où se trouvait la valeur dont j'avais besoin, cliqué avec le bouton droit et sélectionné "copier l'expression". Ce qui m'a été donné était "... HTMLDocumentClass ..." La suppression du texte "Class" de celui-ci a résolu le problème pour moi.
majestzim
3

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

Projet VS 2013 VB.NET> Accessoires> Réf.> Bibliothèque d'objets Microsoft Word 12.0> Incorporer les types d'interopérabilité: changez Vrai en Faux

Doug Null
la source
1

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 de l'assembly Interop TestStand dans la section références de votre projet dans l'Explorateur de solutions. Recherchez la propriété Embed Interop Types dans le navigateur de propriétés et remplacez la valeur par False

Ramezani r
la source
1

Visual Studio 2017 version 15.8 a permis d'utiliser la PackageReferencesyntax pour référencer des packages NuGet dans des projets Visual Studio Extensibility (VSIX). Cela rend beaucoup plus simple de raisonner sur les packages NuGet et ouvre la porte à un package méta complet contenant l'intégralité du VSSDK.

L'installation ci-dessous du package NuGet résoudra le problème EmbedInteropTypes .

Install-Package Microsoft.VisualStudio.SDK.EmbedInteropTypes

Rahul
la source