Jenis interop tidak dapat disematkan


668

Saya membuat aplikasi web pada .NET 4.0 framework (beta2) di C #.

Ketika saya mencoba menggunakan perakitan yang disebut "ActiveHomeScriptLib", saya mendapatkan kesalahan berikut:

Tipe Interop 'ActiveHomeScriptLib.ActiveHomeClass' tidak dapat disematkan. Gunakan antarmuka yang berlaku sebagai gantinya.

Ketika saya mengubah kerangka kerja ke versi 3.5, saya tidak memiliki kesalahan.

Apa itu Jenis Interop dan mengapa ini hanya terjadi ketika saya menggunakan kerangka kerja 4.0?


Saya menemukan artikel ini sangat membantu untuk menyelesaikan masalah interop / PIA. blogs.msdn.com/b/vbteam/archive/2010/06/11/...
GilesDMiddleton

Jawaban:


1069

.NET 4.0 memungkinkan rakitan interop primer (atau lebih tepatnya, bit-bit yang Anda butuhkan) untuk dimasukkan ke dalam rakitan Anda sehingga Anda tidak perlu menempatkannya di samping aplikasi Anda.

Untuk alasan apa pun, perakitan ini tidak dapat disematkan - tetapi sepertinya itu bukan masalah bagi Anda. Cukup buka tab Properties untuk perakitan di Visual Studio 2010 dan atur "Embed Interop Types" ke "False".

EDIT: Lihat juga jawaban Michael Gustus , menghapus Classakhiran dari tipe yang Anda gunakan.


2
Sayangnya, ini kedengarannya seperti yang saya butuhkan, tetapi properti ini sepertinya tidak tersedia lagi.
Dave

130
Saya mencari di halaman properti Project alih-alih klik kanan | Properti pada DLL yang terpengaruh di panel Referensi.
justSteve

5
Bukankah lebih masuk akal untuk melakukan seperti yang dikatakan kesalahan dan "menggunakan antarmuka yang berlaku"? Saya mengalami kesalahan ini (dari kelas yang berbeda) dan dapat membuat instance antarmuka yang kelasnya ditetapkan sebagai atribut CoClass, dan itu berhasil. Seperti pada jawaban Michael Gustus di bawah ini, antarmuka untuk BlahClass baru saja disebut Blah, yang tampaknya merupakan konvensi standar.
Tim Goodman

1
Satu hal hebat tentang penyematan adalah bahwa rakitan Interop dapat tetap CopyLocal = Salah, karena Anda tidak memerlukannya saat runtime.
Schmuli

@TimGoodman bagi saya "antarmuka yang berlaku" tidak berfungsi, tetapi pengaturan embed interop typesproperti yang disebutkan di atas untuk falsemelakukan trik. Dalam kasus saya - saya bekerja dengan Microsoft.Office.Interop.Excelperpustakaan dan perlu mengakses objek Buku Kerja. Menggunakan antarmuka itu Workbook(konvensi penamaan btw ...) bukan pilihan - saya terima COM object, bukan yang diinginkanMicrosoft.Office.Interop.Excel.WorkbookClass
Prokurors

485

Dalam kebanyakan kasus, kesalahan ini adalah hasil dari kode yang mencoba untuk instantiate objek COM. Sebagai contoh, ini adalah bagian dari kode yang memulai Excel:

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

Biasanya, dalam .NET 4 Anda hanya perlu menghapus akhiran 'Kelas' dan kompilasi kode:

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

Penjelasan MSDN ada di sini .


16
+1 Saya yakin ini adalah pesan kesalahan yang sebenarnya ingin Anda lakukan ketika dikatakan "gunakan antarmuka yang berlaku". Perhatikan bahwa Excel.Application adalah antarmuka (terlepas dari kenyataan bahwa itu dapat dipakai dengan kata kunci baru, mirip dengan situasi yang dijelaskan di sini: stackoverflow.com/questions/6960910/… )
Tim Goodman

"Jenis Embed Interop" ke "False" atau "True" ?
Kiquenet

1
@Kiquenet jika Anda mengikuti saran di sini Anda dapat mengatur 'Embed Interop Types' kembali ke True, atau setidaknya itu bekerja dengan baik untuk saya
Sam Holder

122

Seperti Jan Butuh waktu beberapa saat untuk mendapatkannya .. = S Jadi bagi siapa pun yang buta dengan frustrasi.

  • Klik kanan majelis menyinggung yang Anda tambahkan dalam explorer solusi di bawah Referensi proyek Anda . (Dalam kasus saya WIA)
  • Klik properti.
  • Dan harus ada opsi di sana untuk Embed Interop Assembly.
  • Setel ke False

15
Masih berjuang sampai saya menyadari Anda harus mengklik kanan rakitan interop di bawah proyek Referensi di Solution Explorer, BUKAN rakitan yang sedang Anda bangun!
SteveWilkinson

2
Sekarang, (sepuluh tahun kemudian) opsi ini disebut "Embed Interop Types"
David Foley

36

Di sinilah tempat untuk mengatur Embed Interop di Visual Studio 2012

masukkan deskripsi gambar di sini


34

Memperluas jawaban yang benar dari Jon.

Masalahnya di sini adalah bahwa Anda menggabungkan fitur "Embed Interop Types" (atau NoPIA) baru dengan penggunaan tipe kelas. Fitur "Tipe Embed Interop" bekerja dengan menghubungkan secara esensial secara statis semua jenis dari PIA (Majelis Interop Primer) ke dalam unit referensi yang menghilangkan overhead penerapannya.

Fitur ini berfungsi dengan baik untuk sebagian besar tipe dalam PIA tetapi memiliki batasan. Salah satunya adalah Anda tidak dapat menyematkan kelas (ini adalah masalah servis). Misha memiliki artikel blog terperinci tentang mengapa ini tidak diperbolehkan


15

Dapatkan solusinya

Pergi ke referensi klik kanan dll yang diinginkan Anda akan mendapatkan opsi "Embed Interop Types" ke "False" atau "True".


1
Ini juga bekerja untuk VS2015 c # dengan .net menggunakan PP_COM_Wrapper; diberikan dalam contoh cypress.com Cypress Semiconductor Corporation C # Lib. Pengaturan ke False menyingkirkan kesalahan.
user3564895

9

Saya mengalami masalah ini ketika menarik proyek TFS ke mesin lokal saya. Diduga, itu bekerja dengan baik pada mesin pria yang menulisnya. Saya hanya mengubah ini ...

WshShellClass shellClass = new WshShellClass();

Untuk ini...

WshShell shellClass = new WshShell();

Sekarang, itu bekerja seperti juara!


1
Pendekatan ini juga bekerja untuk saya! Dalam kasus saya, saya sedang melakukan debug untuk menemukan di mana nilai yang saya butuhkan adalah, klik kanan dan pilih "salin ekspresi". Apa yang diberikan kepada saya adalah "... HTMLDocumentClass ..." Menghapus teks "Class" dari itu memecahkan masalah bagi saya.
majestzim

3

Saya memiliki masalah yang sama di VB.NET 2013 dengan Office 2007, dan ini menyelesaikannya:

VS 2013 VB.NET Project> Props> Refs> Microsoft Word 12.0 Object Lib> Jenis Embed Interop: ubah Benar ke Salah


1

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

Kesalahan ini terjadi karena nilai default adalah benar untuk properti Jenis Interop Embed dari rakitan Interop TestStand API yang dirujuk dalam proyek baru. Untuk mengatasi kesalahan ini, ubah nilai properti Tipe Tanam Tertanam menjadi Salah dengan mengikuti langkah-langkah ini: Pilih referensi Majelis Interop TestStand di bagian referensi proyek Anda di Solution Explorer. Temukan properti Tipe Tanamkan Interop di Browser Properti, dan ubah nilainya menjadi Salah


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.