712 votes

Le type Interop ne peut pas être incorporé

Je suis en train de créer une application web sur le framework .NET 4.0 (beta2) en C#.

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

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

Lorsque je passe au framework version 3.5, je n'ai pas d'erreurs.

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

0 votes

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

1143voto

Jon Skeet Points 692016

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

Pour une raison quelconque, cet assembly ne peut pas être incorporé - mais il semble que ce n'est pas un problème pour vous. Il vous suffit d'ouvrir l'onglet Propriétés de l'assembly dans Visual Studio 2010 et de définir "Incorporer les types d'interopérabilité" sur "Faux".

EDIT : Voir aussi la réponse de Michael Gustus, en retirant le suffixe Class des types que vous utilisez.

3 votes

Malheureusement, cela semble être exactement ce dont j'ai besoin, mais cette propriété ne semble plus être disponible.

145 votes

Je regardais dans la page des propriétés du projet au lieu de faire un clic droit | Propriétés sur le DLL concerné dans le volet Références.

5 votes

Ne serait-il pas plus logique de suivre l'erreur et de "utiliser l'interface applicable"? J'ai eu cette erreur (provenant d'une classe différente) et j'ai été capable d'instancier une interface qui avait cette classe spécifiée comme étant son 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.

523voto

Michael Gustus Points 2051

Dans la plupart des cas, cette erreur est le résultat d'un 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 général, dans .NET 4, il suffit de supprimer le suffixe 'Class' et de compiler le code :

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

Une explication MSDN est disponible ici.

16 votes

+1 Je crois que c'est en fait ce que le message d'erreur vous dit de faire lorsque cela 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/…)

0 votes

"Type d'interopération intégré" à "Faux" ou "Vrai" ?

1 votes

@Kiquenet si vous suivez les conseils ici, vous pouvez remettre "Interop Types intégrés" sur Vrai, ou du moins cela a bien fonctionné pour moi

128voto

gideon Points 12241

Comme Jan, cela m'a pris un certain temps pour comprendre.. =S Donc pour tout autre personne qui est aveuglée par la frustration.

  • Faites un clic droit sur l'assembly problématique que vous avez ajouté dans l'explorateur de solutions sous votre projet Références. (Dans mon cas WIA)
  • Cliquez sur Propriétés.
  • Et il devrait y avoir l'option Intégrer l'Assembly d'Interop là-bas.
  • Paramétrez-le sur False

15 votes

Encore en difficulté jusqu'à ce que je réalise que vous deviez cliquer avec le bouton droit sur l'assembly interop sous les références du projet dans l'Explorateur de solutions, PAS l'assembly que vous êtes en train de construire !

4 votes

Maintenant, (dix ans plus tard) cette option est appelée "Incorporer les types d'interopérabilité"

35voto

JaredPar Points 333733

En ajoutant à 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 en liant essentiellement de manière statique tous les types d'un PIA (Assembly Interop Principal) dans l'assembly de référence, supprimant ainsi les frais généraux de son déploiement.

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

15voto

Navdeep Points 41

Obtenu la solution

Allez dans les références, faites un clic droit sur le fichier dll souhaité, vous aurez l'option "Intégrer les types d'interopérabilité" à "Faux" ou "Vrai".

1 votes

Cela a également fonctionné pour VS2015 c# avec .net en utilisant PP_COM_Wrapper; donné dans cypress.com exemple de librairie C# de Cypress Semiconductor Corporation. En mettant à False, l'erreur a disparu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X