Birlikte çalışma türü gömülemez


668

C # .NET 4.0 çerçevesi (beta2) üzerinde bir web uygulaması oluşturuyorum.

"ActiveHomeScriptLib" adlı bir derleme kullanmaya çalıştığımda, aşağıdaki hatayı alıyorum:

Birlikte çalışma türü 'ActiveHomeScriptLib.ActiveHomeClass' gömülemez. Bunun yerine uygun arayüzü kullanın.

Çerçeveyi sürüm 3.5 olarak değiştirdiğimde hatam yok.

Birlikte Çalışma Türü nedir ve bu neden yalnızca 4.0 çerçevesini kullandığımda oluşur?


Bu makaleyi birlikte çalışabilirlik / PIA sorunlarını çözmek için çok yararlı buldum. blogs.msdn.com/b/vbteam/archive/2010/06/11/…
GilesDMiddleton

Yanıtlar:


1069

.NET 4.0, birincil birlikte çalışma derlemelerinin (ya da daha doğrusu, ihtiyacınız olan bitlerin) derlemenize gömülmesini sağlar, böylece bunları uygulamanızla birlikte dağıtmanıza gerek kalmaz.

Her ne sebeple olursa olsun, bu montaj gömülemez - ama bu sizin için bir sorun değil gibi görünüyor. Visual Studio 2010'da derleme için Özellikler sekmesini açın ve "Birlikte Çalışma Türlerini Yerleştir" i "Yanlış" olarak ayarlayın.

DÜZENLEME: Ayrıca eki kullandığınız türlerden kaldırarak Michael Gustus'un cevabına da bakınız Class.


2
Ne yazık ki, bu sadece ihtiyacım olan gibi görünüyor, ancak bu özellik artık mevcut görünmüyor.
Dave

130
Sağ tıklama yerine Proje'nin özellik sayfasına bakıyordum | Başvurular bölmesinde etkilenen DLL üzerindeki özellikler.
justSteve

5
Hatanın söylediği gibi "geçerli arayüzü kullanın" demek daha anlamlı olmaz mıydı? Bu hatayı (farklı bir sınıftan) vardı ve bu sınıfın CoClass özniteliği olarak belirtilen bir arabirimi somutlaştırmayı başardı ve işe yaradı. Aşağıdaki Michael Gustus'un cevabında olduğu gibi, BlahClass'ın arayüzüne sadece standart sözleşme gibi görünen Blah deniyordu.
Tim Goodman

1
Gömmeyle ilgili en iyi şey, Interop derlemesinin CopyLocal = False olarak kalmasıdır, çünkü çalışma zamanında ihtiyacınız yoktur.
Schmuli

@TimGoodman benim için "uygulanabilir arayüz" çalışmıyor, ama yukarıda belirtilen embed interop typesözelliği ayarlamak falsehile yaptı. Benim durumumda - Microsoft.Office.Interop.Excelkütüphane ile çalışıyordum ve Workbook nesnesine erişmem gerekiyordu. Arayüzünü kullanmak Workbook(btw. Adlandırma kuralı ...) bir seçenek COM objectdeğildiMicrosoft.Office.Interop.Excel.WorkbookClass
Aldım

484

Çoğu durumda, bu hata, bir COM nesnesini somutlaştırmaya çalışan kodun sonucudur. Örneğin, Excel'i başlatan bir kod parçası:

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

Genellikle, .NET 4'te sadece 'Sınıf' sonekini kaldırmanız ve kodu derlemeniz gerekir:

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

Bir MSDN açıklaması burada .


16
+1 Sanırım hata mesajı "geçerli arayüzü kullan" derken yapmanız gerektiğini söyler. Excel.Application'ın bir arayüz olduğunu unutmayın (burada açıklanan duruma benzer şekilde, yeni anahtar kelimeyle somutlaştırılabilmesine rağmen: stackoverflow.com/questions/6960910/… )
Tim Goodman

"Yerleştir Interop'un Türleri" için "Yanlış" veya "Doğru" ?
Kiquenet

1
@Kiquenet, buradaki tavsiyelere uyursanız, 'Birlikte Çalışma Türlerini Yerleştir' seçeneğini True olarak ayarlayabilir veya en azından benim için işe yaradı
Sam Holder

122

Jan gibi Onu almam biraz zaman aldı .. = S Yani hayal kırıklığı ile kör olan herkes için.

  • Proje başvurular altında çözüm gezgininde eklediğiniz rahatsız edici montajı sağ tıklayın . (Benim durumumda WIA)
  • Özellikler'i tıklayın.
  • Ve Embed Interop Assembly için bir seçenek olmalı .
  • Yanlış olarak ayarla

15
Yaptığınız montaj DEĞİL , Çözüm Gezgini'nde Referanslar projesi altında birlikte çalışabilir montajı sağ tıklamanız gerektiğini fark edene kadar hala mücadele ediyorum !
SteveWilkinson

2
Şimdi, (on yıl sonra) bu seçeneğe "Birlikte Çalışma Türlerini Göm" denir
David Foley

36

Visual Studio 2012'de Embed Interop'u nereye yerleştireceğiniz aşağıda açıklanmıştır

resim açıklamasını buraya girin


34

Jon'un doğru cevabını genişletmek.

Buradaki sorun, yeni "Birlikte Çalışma Türlerini Göm" (veya NoPIA) özelliğini bir sınıf türünün kullanımı ile birleştirmenizdir. "Birlikte Çalışma Türlerini Göm" özelliği, PIA'dan (Birincil Birlikte Çalışma Düzeneği) tüm türlerde, dağıtma ek yükünü kaldırarak başvuru derlemesine statik olarak bağlayarak çalışır.

Bu özellik bir PIA'daki çoğu tip için harika çalışır, ancak kısıtlamaları vardır. Bunlardan biri, sınıfları gömemeyeceğinizdir (bu bir servis sorunu). Misha'nın buna neden izin verilmediğine dair ayrıntılı bir blog makalesi var


15

Çözüm var

Referanslara gitmek istediğiniz dll sağ tıklayın seçeneği "Yanlış" veya "Doğru" Embed Interop Türleri "alacaksınız.


1
Bu ayrıca PP_COM_Wrapper kullanarak .net ile VS2015 c # için çalıştı; cypress.com'da verilen Cypress Semiconductor Corporation C # Lib örneği. False olarak ayarlamak hatadan kurtuldu.
user3564895

9

Bir TFS projesini yerel makineme çekerken bu sorunla karşılaştım. İddiaya göre, onu yazan adamın makinesinde iyi çalışıyordu. Bunu basitçe değiştirdim ...

WshShellClass shellClass = new WshShellClass();

Buna...

WshShell shellClass = new WshShell();

Şimdi, şampiyon gibi çalışıyor!


1
Bu yaklaşım benim için de işe yaradı! Benim durumumda, ihtiyacım olan değerin nerede olduğunu bulmak için hata ayıklama yapıyordum, sağ tıklayıp "kopya ifadesini" seçtim. Bana verilen "... HTMLDocumentClass ..." "Sınıf" metninin kaldırılması sorunu benim için çözdü.
majestzim

3

Office 2007 ile VB.NET 2013'te aynı sorunu yaşadım ve bu çözüldü:

VS 2013 VB.NET Project> Props> Refs> Microsoft Word 12.0 Nesne Lib> Birlikte Çalışma Türlerini Göm: True değerini False olarak değiştir


1

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

Bu hata, yeni projede başvurulan TestStand API Interop derlemesinin Embed Interop Türleri özelliği için varsayılan değer doğru olduğu için oluşur. Bu hatayı gidermek için aşağıdaki adımları izleyerek Birlikte Çalışma Türlerini Yerleştir özelliğinin değerini Yanlış olarak değiştirin: Çözüm Gezgini'nde projenizin başvurular bölümünde TestStand Birlikte Çalışma Derlemesi başvurusunu seçin. Özellik Tarayıcısı'nda Birlikte Çalışma Birlikte Çalışma Türleri özelliğini bulun ve değeri Yanlış olarak değiştirin


1

Visual Studio 2017 sürüm 15.8 , Visual Studio Genişletilebilirlik (VSIX) projelerinde NuGet paketlerine başvurmak için PackageReferencesyntax'ın kullanılmasını mümkün kıldı. Bu, NuGet paketleri hakkında mantık yürütmeyi çok daha basit hale getirir ve tüm VSSDK'yı içeren eksiksiz bir meta pakete sahip olmak için kapıyı açar.

NuGet paketinin altına yüklendiğinde EmbedInteropTypes Sorunu çözülecektir .

Yükleme Paketi Microsoft.VisualStudio.SDK.EmbedInteropTypes

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.