Apa perbedaan pengaturan Jenis Interop Sematan benar dan salah di Visual Studio?

121

Dalam Visual Studio, ketika menambahkan satu referensi ke proyek, jendela properti memiliki opsi Embed Inteop Types, haruskah kita mengaturnya ke Trueatau False? Apa bedanya?

Karena kami memiliki banyak proyek, di antaranya, referensi ditetapkan False, yang lain ditetapkan True, itu benar-benar kacau. Dan server bulid juga memiliki peringatan yang sama:

Apa yang dimaksud dengan "referensi dibuat untuk perakitan interop tertanam"?

Jadi kami berencana untuk mengubah semua Embed Inteop Typesmenjadi False, risiko apa yang akan kami dapatkan?

Jerry Bian
sumber
4
Jangan pernah melakukan ini, ini adalah fitur yang sangat luar biasa yang memecahkan detail penerapan yang menjengkelkan. Anda harus memahami COM untuk benar-benar memahami tentang apa ini semua.
Hans Passant
@HansPassant, apakah Anda mengatakan tidak pernah mengaturnya falseatau tidak pernah mengubahnya (misalnya jika default falsesudah)?
noelicus
2
Dia berencana untuk menyetelnya ke False. Jangan lakukan ini.
Hans Passant
3
@HansPassant bagaimana Anda menggunakan menjengkelkan dan grok. sangat brittish: D
Mafii
4
@Mafii Saya pikir grok berasal dari Stranger in a Strange Land (yang orang Amerika). Tidak berarti Inggris mungkin tidak menggunakannya lagi, tentunya!
UuDdLrLrSs

Jawaban:

79

Opsi ini diperkenalkan untuk menghilangkan kebutuhan untuk menyebarkan PIA yang sangat besar (Sidang Interop Primer) untuk interop.

Ini hanya menyematkan kode penghubung terkelola yang digunakan yang memungkinkan Anda untuk berbicara dengan rakitan yang tidak dikelola, tetapi alih-alih menyematkannya semua itu hanya membuat hal-hal yang benar-benar Anda gunakan dalam kode.

Baca lebih lanjut di posting blog Scott Hanselman tentang itu dan perbaikan VS lainnya di sini .

Baik disarankan atau tidak, saya tidak yakin karena saya tidak perlu menggunakan fitur ini. Pencarian web cepat menghasilkan beberapa petunjuk:

Satu-satunya risiko mengubah semuanya menjadi salah adalah masalah penerapan yang lebih besar dengan file PIA dan penerapan yang lebih besar jika beberapa file tersebut berukuran besar.

Adam Houldsworth
sumber
1
Perhatikan bahwa ada perbedaan yang cukup signifikan yang dapat merusak kode yang ada saat menonaktifkan Jenis Interop Sematan . Perbedaannya disebutkan di sini : “C # 4, dan versi yang lebih baru, mengubah objek yang dikembalikan menjadi dinamis secara otomatis jika rakitan direferensikan oleh opsi kompiler / link atau, secara ekuivalen, jika properti Excel Embed Interop Type disetel ke true. Benar adalah nilai default untuk properti ini. "
Dirk Vollmar
Rakitan interop yang disematkan memberi saya masalah dalam sistem berbasis plug-in, di mana host dan plugin bergantung pada objek COM yang sama . Masalah lain adalah menggabungkan majelis semacam itu dengan ILMerge .
Ant_222
8

Saya perhatikan bahwa ketika disetel ke false, saya dapat melihat nilai item menggunakan debugger. Ketika disetel ke true, saya mendapatkan kesalahan - item.FullName.GetValue Jenis interop tertanam 'FullName' tidak berisi definisi untuk 'QBFC11Lib.IItemInventoryRet' karena tidak digunakan dalam rakitan yang dikompilasi. Pertimbangkan mentransmisikan ke objek atau mengubah properti 'Jenis Interop Sematan' menjadi benar.

pengguna890332
sumber