2010-03-20 26 views
559

Sto creando un'applicazione Web sul framework .NET 4.0 (beta2) in C#.Non è possibile incorporare il tipo di intervallo

Quando si tenta di utilizzare un assembly chiamato "ActiveHomeScriptLib", ottengo il seguente errore:

Interop type 'ActiveHomeScriptLib.ActiveHomeClass' cannot be embedded. Use the applicable interface instead.

Quando cambio il quadro alla versione 3.5, non ho errori.

Che cos'è un tipo di intervallo e perché si verifica solo quando utilizzo il framework 4.0?

+0

ho trovato questo articolo molto utile per la risoluzione dei problemi di interoperabilità/PIA. http://blogs.msdn.com/b/vbteam/archive/2010/06/11/troubleshooting-errors-when-embedding-type-information-doug-rothaus.aspx – GilesDMiddleton

risposta

896

.NET 4.0 consente di incorporare assiemi di interoperabilità primari (o meglio i bit necessari) nell'assieme 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 voi. Basta aprire la scheda Proprietà per l'assembly in Visual Studio 2010 e impostare "Incorpora tipi di interoperabilità" su "False".

MODIFICA: Vedere anche answer di Michael Gustus, rimuovendo il suffisso Class dai tipi in uso.

+1

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

+94

Stavo cercando nella pagina delle proprietà del progetto invece del clic con il pulsante destro del mouse | Proprietà sulla DLL effettuata nel riquadro Riferimenti. – justSteve

+1

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

31

Espansione sulla risposta corretta di Jon.

Il problema è che si sta 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 (Primary Interop Assembly) nell'assieme di riferimento rimuovendo il sovraccarico di distribuzione.

Questa funzione è ideale per la maggior parte dei tipi in un PIA, ma ha delle restrizioni. Uno di questi è che non è possibile incorporare classi (è un problema di manutenzione). Misha ha un articolo del blog dettagliate sul motivo per cui questo non è consentito

98

come Jan Mi c'è voluto un po 'per farlo .. = S Quindi per chiunque altro che ha accecato con frustrazione.

  • fare clic destro del mouse sul gruppo di offendere che è stato aggiunto nella soluzione Explorer sotto il vostro progetto Riferimenti. (Nel mio caso WIA)
  • Proprietà clic.
  • E dovrebbe esserci l'opzione per Assieme Interop incorporamento.
  • impostarla su false
+14

Ancora in difficoltà 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 ** l'assieme che stai costruendo! – SteveWilkinson

415

Nella maggior parte dei casi, questo errore è il risultato di codice che tenta di creare un'istanza di un oggetto COM. Ad esempio, ecco un pezzo di codice messa in funzione di 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(); 

Un MSDN la spiegazione è here.

+10

+1 Credo che questo sia ciò che il messaggio di errore sta effettivamente dicendo di fare quando dice "usa l'interfaccia applicabile". Nota che Excel.Application è un'interfaccia (nonostante possa essere istanziata con la nuova parola chiave, simile alla situazione descritta qui: http: // stackoverflow.it/questions/6960910/what-does-the-c-sharp-coclass-attribute-do) –

+0

_ "Incorpora tipi di intervallo" _ a ** "False" ** o ** "True" **? – Kiquenet

+1

@Kiquenet se segui il consiglio qui puoi impostare 'Incorpora tipi di interoperabilità' su True, o almeno ha funzionato bene per me –

12

Got la soluzione

Vai riferimenti tasto destro del mouse la dll desiderato otterrete opzione "Tipi di incorporare Interop" a "false" o "True".

+1

Questo ha funzionato anche per VS2015 C# con .net usando PP_COM_Wrapper; fornito in http://www.cypress.com Cypress Semiconductor Corporation C# Lib esempio. Impostando su False si è sbarazzato dell'errore. – user3564895

1

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

Questo errore si verifica perché il valore predefinito è vero per l'interoperabilità Embed tipi di proprietà del gruppo TestStand API di interoperabilità riferimento nel nuovo progetto. Per risolvere questo errore, modificare il valore della proprietà Tipi di interoperabilità incorporare su False seguendo questi passaggi: Selezionare il riferimento Assembler di interoperabilità TestStand nella sezione dei riferimenti del progetto in Esplora soluzioni. Trova la tipi di proprietà Embed interoperabilità nel Browser proprietà, e modificare il valore False

2

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

VS 2013 VB.NET progetto > Puntelli> Refs> Microsoft Word 12.0 Object Lib> Incorpora tipi di interoperabilità: cambia True in False

7

Mi sono imbattuto in questo problema quando tiravo giù un progetto TFS sul mio computer locale. Presumibilmente, stava funzionando benissimo sulla macchina del ragazzo che l'ha scritta. Ho semplicemente cambiato questo ...

WshShellClass shellClass = new WshShellClass(); 

Per questo ...

WshShell shellClass = new WshShell(); 

Ora, si sta lavorando come un campione!

+1

Questo approccio ha funzionato anche per me! Nel mio caso, stavo eseguendo il debug per trovare il valore di cui avevo bisogno, facendo clic con il pulsante destro del mouse e selezionando "copy expression". Quello che mi è stato dato era "... HTMLDocumentClass ..." Rimozione del testo "Classe" da esso risolto il problema per me. – majestzim

17

Ecco dove impostare l'Embed interoperabilità in Visual Studio 2012

enter image description here

Problemi correlati