2013-12-11 14 views
82

In Visual Studio, quando si aggiunge un riferimento al progetto, la finestra delle proprietà ha un'opzione Embed Inteop Types, dovremmo impostarla su True o False? Qual è la differenza?Qual è l'impostazione di differenza Incorpora tipi di interoperabilità true e false in Visual Studio?

Poiché abbiamo molti progetti, tra alcuni di essi, il riferimento è stato impostato su False, altri sono stati impostati su True, è completamente confuso. E il server bulid hanno anche gli stessi avvertimenti:

What does “reference was created to embedded interop assembly” mean?

Così abbiamo in programma di cambiare tutto il Embed Inteop Types-False, quale rischio otterremmo?

+3

Mai fare questo, è una funzionalità davvero fantastica che risolve i fastidiosi dettagli di distribuzione. Devi capire la COM per farti davvero capire di cosa si tratta. –

+0

@HansPassant, stai dicendo che non li hai mai impostati 'false' o che non li hai mai modificati (ad esempio se sono già impostati su' false')? – noelicus

+1

Ha intenzione di impostarlo su False. Non farlo mai. –

risposta

55

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

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

Ulteriori informazioni nel post del blog di Scott Hanselman su di esso e altri miglioramenti VS here.

Per quanto riguarda se è consigliato o meno, non sono sicuro in quanto non è necessario utilizzare questa funzione. Una rapida ricerca sul web produce un paio di cavi:

L'unico rischio di tutti rivolgendosi al falso è più preoccupazioni di implementazione con i file Pia e una distribuzione più grande se alcuni di quelli i file sono grandi

+1

Si noti che esiste una differenza piuttosto significativa che potrebbe interrompere il codice esistente quando si disattiva * Incorpora tipi di interoperabilità * disattivati. La differenza è menzionata [qui] (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interop/how-to-access-office-onterop-objects): * "C# 4, e versioni successive, converte automaticamente l'oggetto restituito in dinamico se l'assembly viene referenziato dall'opzione/link del compilatore o, in modo equivalente, se la proprietà Excel Interop tipi di interop è impostata su true. True è il valore predefinito per questa proprietà. "* –

6

Ho notato che quando è impostato su false, sono in grado di vedere il valore di un elemento utilizzando il debugger. Quando è stato impostato su true, ricevo un errore - item.FullName.GetValue Il tipo di interoperabilità incorporato "FullName" non contiene una definizione per "QBFC11Lib.IItemInventoryRet" poiché non è stata utilizzata nell'assembly compilato. Prendi in considerazione la possibilità di eseguire il casting dell'oggetto o modificare la proprietà 'Incorpora tipi di interoperabilità'.

Problemi correlati