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?

Jan
sumber
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.

Jon Skeet
sumber
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 .

Michael Gustus
sumber
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
Gideon
sumber
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

VK_217
sumber
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

JaredPar
sumber
15

Dapatkan solusinya

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

Navdeep
sumber
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!

Zach
sumber
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

Doug Null
sumber
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

Ramezani r
sumber
1

Visual Studio 2017 versi 15.8 memungkinkan untuk menggunakan PackageReferenceyntax untuk referensi paket NuGet dalam proyek Visual Studio Extensibility (VSIX). Ini membuatnya lebih mudah untuk mempertimbangkan tentang paket NuGet dan membuka pintu untuk memiliki paket meta lengkap yang berisi seluruh VSSDK.

Menginstal di bawah paket NuGet akan menyelesaikan Masalah EmbedInteropTypes .

Instal-Paket Microsoft.VisualStudio.SDK.EmbedInteropTypes

Rahul
sumber