Il tipo di interoperabilità non può essere incorporato


668

Sto creando un'applicazione Web sul framework .NET 4.0 (beta2) in C #.

Quando provo ad usare un assembly chiamato "ActiveHomeScriptLib", ottengo il seguente errore:

Il tipo di interoperabilità "ActiveHomeScriptLib.ActiveHomeClass" non può essere incorporato. Utilizzare invece l'interfaccia applicabile.

Quando cambio il framework alla versione 3.5, non ho alcun errore.

Che cos'è un tipo di interoperabilità e perché ciò si verifica solo quando utilizzo il framework 4.0?


Ho trovato questo articolo molto utile per risolvere i problemi di interoperabilità / PIA. blogs.msdn.com/b/vbteam/archive/2010/06/11/…
GilesDMiddleton

Risposte:


1069

.NET 4.0 consente agli assembly di interoperabilità primari (o meglio, i bit necessari) di essere incorporati nell'assembly in modo da non doverli distribuire insieme all'applicazione.

Per qualsiasi motivo, questo assembly non può essere incorporato, ma sembra che non sia un problema per te. Basta aprire la scheda Proprietà per l'assembly in Visual Studio 2010 e impostare "Incorpora tipi di interoperabilità" su "Falso".

EDIT: vedi anche la risposta di Michael Gustus , rimuovendo il Classsuffisso dai tipi che stai utilizzando.


2
Sfortunatamente, sembra proprio quello di cui ho bisogno, ma questa proprietà non sembra più disponibile.
Dave,

130
Stavo cercando nella pagina delle proprietà del Progetto invece del tasto destro del mouse | Proprietà sulla DLL effettuata nel riquadro Riferimenti.
JustSteve

5
Non avrebbe più senso fare come dice l'errore e "utilizzare l'interfaccia applicabile"? Ho avuto questo errore (da una classe diversa) ed è stato in grado di creare un'istanza di un'interfaccia che aveva quella classe specificata come suo attributo CoClass e ha funzionato. Come nella risposta di Michael Gustus di seguito, l'interfaccia per BlahClass era appena chiamata Blah, che sembra essere la convenzione standard.
Tim Goodman,

1
Un aspetto positivo dell'incorporamento è che l'assembly Interop può rimanere CopyLocal = False, poiché non è necessario in fase di esecuzione.
Schmuli,

@TimGoodman per me "interfaccia applicabile" non funzionava, ma impostare la embed interop typesproprietà sopra menzionata per falsefare il trucco. Nel mio caso, stavo lavorando con la Microsoft.Office.Interop.Excellibreria e avevo bisogno di accedere all'oggetto Cartella di lavoro. Usare la sua interfaccia Workbook(tra cui. Convenzione di denominazione ...) non era un'opzione - ho ricevuto COM object, non il desideratoMicrosoft.Office.Interop.Excel.WorkbookClass
Prokurors

485

Nella maggior parte dei casi, questo errore è il risultato del codice che tenta di creare un'istanza di un oggetto COM. Ad esempio, ecco un pezzo di codice che avvia Excel:

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

In genere, in .NET 4 è sufficiente rimuovere il suffisso 'Class' e compilare il codice:

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

Una spiegazione MSDN è qui .


16
+1 Credo che questo sia ciò che il messaggio di errore ti sta effettivamente dicendo quando dice "usa l'interfaccia applicabile". Si noti che Excel.Application è un'interfaccia (nonostante il fatto che possa essere istanziato con la nuova parola chiave, simile alla situazione qui descritta: stackoverflow.com/questions/6960910/… )
Tim Goodman,

"Incorpora tipi di interoperabilità" in "Falso" o "Vero" ?
Kiquenet,

1
@Kiquenet se segui i consigli qui puoi impostare 'Incorpora tipi di interoperabilità' su Vero, o almeno per me ha funzionato bene
Sam Holder

122

Come Jan Mi ci è voluto un po 'per ottenerlo .. = S Quindi per chiunque sia accecato dalla frustrazione.

  • Fare clic con il pulsante destro del mouse sull'assieme in errore che è stato aggiunto in Esplora soluzioni in Riferimenti del progetto . (Nel mio caso WIA)
  • Fai clic su Proprietà.
  • E dovrebbe esserci l'opzione per Embed Interop Assembly.
  • Impostalo su False

15
Ancora faticando fino a quando ho capito che dovevi fare clic con il pulsante destro del mouse sull'assieme di interoperabilità sotto il progetto Riferimenti in Esplora soluzioni, NON sull'assieme che stai costruendo!
SteveWilkinson,

2
Ora, (dieci anni dopo) questa opzione si chiama "Incorpora tipi di interoperabilità"
David Foley,

36

Ecco dove impostare l'Interoper embed in Visual Studio 2012

inserisci qui la descrizione dell'immagine


34

Espandendo la risposta corretta di Jon.

Il problema qui è che stai combinando la nuova funzione "Incorpora tipi di interoperabilità" (o NoPIA) con l'uso di un tipo di classe. La funzione "Incorpora tipi di interoperabilità" funziona essenzialmente collegando staticamente tutti i tipi da un PIA (Assembly di interoperabilità primario) all'assieme di riferimento rimuovendo il sovraccarico di distribuzione.

Questa funzione funziona benissimo per la maggior parte dei tipi in un PIA ma ha delle restrizioni. Uno di questi è che non puoi incorporare le classi (è un problema di manutenzione). Misha ha un articolo di blog dettagliato sul perché questo non è permesso


15

Ho la soluzione

Vai ai riferimenti facendo clic con il pulsante destro del mouse sulla DLL desiderata otterrai l'opzione "Incorpora tipi di interoperabilità" su "Falso" o "Vero".


1
Questo ha funzionato anche per VS2015 c # con .net usando PP_COM_Wrapper; fornito nell'esempio di Cypress.com Cypress Semiconductor C # Lib. L'impostazione su False ha eliminato l'errore.
user3564895

9

Ho riscontrato questo problema durante il pull down di un progetto TFS sul mio computer locale. Presumibilmente, stava funzionando benissimo sulla macchina del ragazzo che l'ha scritto. Ho semplicemente cambiato questo ...

WshShellClass shellClass = new WshShellClass();

A questo...

WshShell shellClass = new WshShell();

Ora funziona come un campione!


1
Questo approccio ha funzionato anche per me! Nel mio caso, stavo eseguendo il debug per scoprire dove fosse il valore di cui avevo bisogno, facendo clic con il pulsante destro del mouse e selezionando "copia espressione". Quello che mi è stato dato è stato "... HTMLDocumentClass ..." Rimuovere il testo "Class" da esso ha risolto il problema per me.
Majestzim,

3

Ho avuto lo stesso problema in VB.NET 2013 con Office 2007 e questo ha risolto:

VS 2013 VB.NET Project> Props> Refs> Lib di oggetti di Microsoft Word 12.0> Incorpora tipi di interoperabilità: cambia da Vero a Falso


1

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

Questo errore si verifica perché il valore predefinito è vero per la proprietà Tipi di interoperabilità incorporati dell'assembly Interoper API TestStand a cui si fa riferimento nel nuovo progetto. Per risolvere questo errore, modificare il valore della proprietà Incorpora tipi di interoperabilità su False seguendo questi passaggi: Selezionare il riferimento Assemblaggio interoperabilità TestStand nella sezione riferimenti del progetto in Esplora soluzioni. Trova la proprietà Incorpora tipi di interoperabilità nel Browser delle proprietà e modifica il valore in Falso


1

Visual Studio 2017 versione 15.8 ha reso possibile utilizzare PackageReferencesyntax per fare riferimento a pacchetti NuGet in progetti di Visual Studio Extensibility (VSIX). Questo rende molto più semplice ragionare sui pacchetti NuGet e apre le porte per avere un meta-pacchetto completo contenente l'intero VSSDK.

L'installazione sotto il pacchetto NuGet risolverà il problema EmbedInteropTypes .

Pacchetto di installazione Microsoft.VisualStudio.SDK.EmbedInteropTypes

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.