Qual è la differenza tra l'impostazione dei tipi di interoperabilità incorporata true e false in Visual Studio?


121

In Visual Studio, quando si aggiunge un riferimento al progetto, la finestra delle proprietà ha un'opzione Embed Inteop Types, dobbiamo impostarla su Trueo False? Qual è la differenza?

Dal momento che abbiamo molti progetti, tra alcuni dei quali ci si riferiva False, altri erano stati impostati True, è totalmente sbagliato. E anche il bulid server ha gli stessi avvertimenti:

Che cosa significa "riferimento è stato creato per un assembly di interoperabilità incorporato"?

Quindi abbiamo in programma di cambiare tutto Embed Inteop Typesin False, quale rischio avremmo?


4
Non farlo mai, è una funzionalità davvero fantastica che risolve i fastidiosi dettagli di distribuzione. Devi capire COM per capire veramente di cosa si tratta.
Hans Passant

@ HansPassant, stai dicendo di non impostarli mai falseo di non cambiarli mai (ad esempio se sono falsegià predefiniti )?
noelicus

2
Ha intenzione di impostarlo su False. Non farlo mai.
Hans Passant

3
@HansPassant come mai usi fastidioso e grok. è molto brittish: D
Mafii

4
@Mafii Pensavo che Grok provenisse da Stranger in a Strange Land (che è americano). Non significa che gli inglesi potrebbero non usarlo di più, ovviamente!
UuDdLrLrSs

Risposte:


79

Questa opzione è stata introdotta per eliminare la necessità di distribuire PIA (Primary Interop Assembly) di grandi dimensioni per l'interoperabilità.

Incorpora semplicemente il codice bridging gestito utilizzato che ti consente di parlare con assembly non gestiti, ma invece di incorporarlo tutto crea solo le cose che usi effettivamente nel codice.

Per saperne di più, leggi il post sul blog di Scott Hanselman e altri miglioramenti a VS qui .

Quanto al fatto che sia consigliato o meno, non sono sicuro perché non ho bisogno di usare questa funzione. Una rapida ricerca sul Web produce alcuni lead:

L'unico rischio di trasformarli tutti in false è costituito da maggiori problemi di distribuzione con i file PIA e una distribuzione più ampia se alcuni di questi file sono di grandi dimensioni.


1
Si noti che esiste una differenza piuttosto significativa che potrebbe interrompere il codice esistente quando si disattiva Incorpora tipi di interoperabilità . La differenza è menzionata qui : "C # 4 e le versioni successive convertono automaticamente l'oggetto restituito in dinamico se l'assembly è referenziato dall'opzione del compilatore / link o, in modo equivalente, se la proprietà Excel Embed Interop Types è impostata su true. True è il valore predefinito per questa proprietà. "
Dirk Vollmar

Gli assembly di interoperabilità incorporati mi hanno dato problemi in un sistema basato su plug-in, in cui sia l'host che i plug-in dipendevano dallo stesso oggetto COM . Un altro problema era l'unione di tali assembly con ILMerge .
Ant_222

8

Ho notato che quando è impostato su false, sono in grado di vedere il valore di un elemento utilizzando il debugger. Quando era impostato su true, ricevevo un errore: item.FullName.GetValue Il tipo di interoperabilità incorporato "FullName" non contiene una definizione per "QBFC11Lib.IItemInventoryRet" poiché non è stato utilizzato nell'assembly compilato. Valuta la possibilità di eseguire il cast su un oggetto o di modificare la proprietà "Embed Interop Types" su true.

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.