Nie można osadzić typu interakcji

667

Tworzę aplikację sieci Web na platformie .NET 4.0 (beta2) w języku C #.

Gdy próbuję użyć zestawu o nazwie „ActiveHomeScriptLib”, pojawia się następujący błąd:

Nie można osadzić typu interakcji „ActiveHomeScriptLib.ActiveHomeClass”. Zamiast tego użyj odpowiedniego interfejsu.

Kiedy zmieniam framework na wersję 3.5, nie mam żadnych błędów.

Co to jest typ interakcji i dlaczego dzieje się tak tylko wtedy, gdy używam frameworka 4.0?

Jan
źródło
Uważam, że ten artykuł jest bardzo pomocny w rozwiązywaniu problemów z interop / PIA. blogs.msdn.com/b/vbteam/archive/2010/06/11/…
GilesDMiddleton

Odpowiedzi:

1068

.NET 4.0 pozwala na osadzenie podstawowych zestawów międzyoperacyjnych (a raczej ich potrzebnych fragmentów), dzięki czemu nie trzeba ich wdrażać razem z aplikacją.

Z jakiegokolwiek powodu nie można osadzić tego zestawu - ale wygląda na to, że nie stanowi to dla ciebie problemu. Wystarczy otworzyć kartę Właściwości dla zestawu w Visual Studio 2010 i ustawić „Osadzanie typów interopów” na „Fałsz”.

EDIT: Zobacz też Michael Gustus za odpowiedź , usuwając Classprzyrostek od rodzaju jesteś korzystających.

Jon Skeet
źródło
2
Niestety, brzmi to tak, jak potrzebuję, ale ta właściwość nie jest już dostępna.
Dave
130
Szukałem na stronie właściwości projektu zamiast kliknięcia prawym przyciskiem | Właściwości efektywnej biblioteki DLL w panelu Odnośniki.
justSteve
5
Czy nie ma większego sensu robić, jak mówi błąd i „używać odpowiedniego interfejsu”? Miałem ten błąd (z innej klasy) i byłem w stanie utworzyć instancję interfejsu, który miał tę klasę jako atrybut CoClass i działał. Tak jak w odpowiedzi Michaela Gustusa poniżej, interfejs BlahClass został właśnie nazwany Blah, co wydaje się być standardową konwencją.
Tim Goodman,
1
Wspaniałą rzeczą w osadzaniu jest to, że zestaw Interop może pozostać CopyLocal = False, ponieważ nie jest potrzebny w czasie wykonywania.
Schmuli
@TimGoodman dla mnie „odpowiedni interfejs” nie działał, ale ustawienie wyżej wspomnianej embed interop typeswłaściwości załatwiło sprawę false. W moim przypadku - pracowałem z Microsoft.Office.Interop.Excelbiblioteką i potrzebowałem dostępu do obiektu skoroszytu. Użycie interfejsu Workbook(przy okazji konwencji nazewnictwa ...) nie było opcją - otrzymałem COM object, a nie pożądanyMicrosoft.Office.Interop.Excel.WorkbookClass
Prokurors
484

W większości przypadków ten błąd jest wynikiem kodu, który próbuje utworzyć instancję obiektu COM. Na przykład oto fragment kodu uruchamiający program Excel:

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

Zazwyczaj w .NET 4 wystarczy usunąć sufiks „Class” i skompilować kod:

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

Wyjaśnienie MSDN jest tutaj .

Michael Gustus
źródło
16
+1 Uważam, że tak właśnie mówi komunikat o błędzie, gdy mówi „użyj odpowiedniego interfejsu”. Zauważ, że Excel.Application jest interfejsem (pomimo faktu, że można go utworzyć za pomocą nowego słowa kluczowego, podobnie do opisanej tutaj sytuacji: stackoverflow.com/questions/6960910/… )
Tim Goodman
„Osadzić typy interakcji” na „Fałsz” czy „Prawda” ?
Kiquenet,
1
@Kiquenet, jeśli zastosujesz się do podanych tutaj rad, możesz ustawić „Embed Interop Types” z powrotem na True, a przynajmniej to działało dla mnie dobrze
Sam Holder
122

Jak Jan Zajęło mi to trochę czasu, aby go zdobyć .. = S Więc dla każdego, kto jest zaślepiony frustracją.

  • Kliknij prawym przyciskiem myszy złego zestawu, który został dodany w eksploratorze rozwiązań w ramach projektu Referencje . (W moim przypadku WIA)
  • Kliknij właściwości.
  • I powinna istnieć opcja dla Osadzania zestawu międzyoperacyjnego.
  • Ustaw na False
gideon
źródło
15
Wciąż walczę, dopóki nie zdałem sobie sprawy, że musicie kliknąć prawym przyciskiem myszy zespół interop w ramach projektu Odwołania w Eksploratorze rozwiązań, a NIE zestawie, który budujecie!
SteveWilkinson
2
Teraz (dziesięć lat później) ta opcja nosi nazwę „Osadzanie typów interakcji”
David Foley,
36

Oto gdzie ustawić Embed Interop w Visual Studio 2012

wprowadź opis zdjęcia tutaj

VK_217
źródło
34

Rozwijanie poprawnej odpowiedzi Jona.

Problem polega na tym, że łączysz nową funkcję „Embed Interop Types” (lub NoPIA) z użyciem typu klasy. Funkcja „Osadzanie typów interakcji” działa zasadniczo poprzez statyczne łączenie wszystkich typów z PIA (Primary Interop Assembly) z zespołem referencyjnym, usuwając narzut związany z jego wdrażaniem.

Ta funkcja działa świetnie dla większości typów w PIA, ale ma ograniczenia. Jednym z nich jest to, że nie można osadzać klas (jest to problem z obsługą). Misha ma szczegółowy artykuł na blogu, dlaczego jest to niedozwolone

JaredPar
źródło
15

Mam rozwiązanie

Przejdź do referencji, kliknij prawym przyciskiem myszy żądaną bibliotekę DLL, aby wyświetlić opcję „Osadzanie typów interopów” do „False” lub „True”.

Navdeep
źródło
1
Działa to również dla VS2015 c # z .net przy użyciu PP_COM_Wrapper; podany w cypress.com Przykład Cypress Semiconductor Corporation C # Lib. Ustawienie Fałsz pozbyło się błędu.
user3564895
9

Natrafiłem na ten problem, gdy ściągałem projekt TFS na moją maszynę lokalną. Podobno działało dobrze na maszynie faceta, który to napisał. Po prostu zmieniłem to ...

WshShellClass shellClass = new WshShellClass();

Do tego...

WshShell shellClass = new WshShell();

Teraz działa jak mistrz!

Zach
źródło
1
To podejście również mi się sprawdziło! W moim przypadku debugowałem, aby znaleźć potrzebną wartość, kliknąłem prawym przyciskiem myszy i wybrałem „kopiuj wyrażenie”. To, co otrzymałem, to „... HTMLDocumentClass ...” Usunięcie z niego tekstu „Klasa” rozwiązało problem.
majestzim
3

Miałem ten sam problem w VB.NET 2013 z Office 2007 i to rozwiązało:

VS 2013 VB.NET Project> Rekwizyty> Referencje> Microsoft Word 12.0 Object Lib> Osadzanie typów interakcji: zmień z True na False

Doug Null
źródło
1

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

Ten błąd występuje, ponieważ wartość domyślna jest prawdziwa dla właściwości Osadzanie typów interakcji zestawu TestStand API Interop, do którego odwołuje się nowy projekt. Aby rozwiązać ten błąd, zmień wartość właściwości Embed Interop Types na False, wykonując następujące kroki: Wybierz odwołanie do zestawu TestStand Interop w sekcji odniesień projektu w Eksploratorze rozwiązań. Znajdź właściwość Osadzanie typów typów w przeglądarce właściwości i zmień wartość na False

Ramezani r
źródło
1

Program Visual Studio 2017 w wersji 15.8 umożliwia korzystanie z PackageReferencesyntax do odwoływania się do pakietów NuGet w projektach Visual Studio Extensibility (VSIX). Ułatwia to rozumowanie pakietów NuGet i otwiera drzwi do posiadania kompletnego pakietu meta zawierającego cały VSSDK.

Zainstalowanie poniżej pakietu NuGet rozwiąże problem EmbedInteropTypes .

Zainstaluj pakiet Microsoft.VisualStudio.SDK.EmbedInteropTypes

Rahul
źródło