2010-03-20 15 views
559

Tworzę aplikację internetową w środowisku .NET 4.0 (beta2) w języku C#.Typ interopu nie może być osadzony

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

Interop type 'ActiveHomeScriptLib.ActiveHomeClass' cannot be embedded. Use the applicable interface instead.

Kiedy zmienić ramy do wersji 3.5, nie mam żadnych błędów.

Co to jest typ interopu i dlaczego ma to miejsce tylko w przypadku korzystania z architektury 4.0?

+0

Znalazłem ten artykuł bardzo pomocne w rozwiązywaniu problemów współdziałanie/PIA. http://blogs.msdn.com/b/vbteam/archive/2010/06/11/troubleshooting-errors-when-embedding-type-information-doug-rothaus.aspx – GilesDMiddleton

Odpowiedz

896

. NET 4.0 umożliwia umieszczenie podstawowych zespołów współdziałania (lub ich bitów) w zespole, dzięki czemu nie trzeba ich instalować razem z aplikacją.

Z jakiegoś powodu ten zestaw nie może zostać osadzony - ale wygląda na to, że nie stanowi to dla ciebie problemu. Po prostu otwórz kartę Właściwości dla zespołu w Visual Studio 2010 i ustaw "Embed Interop Types" na "False".

EDYCJA: Zobacz także Michael Gustus's answer, usuwając sufiks Class z typów, których używasz.

+1

Niestety to brzmi jak to, czego potrzebuję, ale ta właściwość nie jest już dostępna. – Dave

+94

Szukałem na stronie właściwości projektu zamiast prawego przycisku myszy | Właściwości dokonanej biblioteki DLL w okienku Odniesienia. – justSteve

+1

Czy nie ma większego sensu robić, jak mówi błąd i "użyć odpowiedniego interfejsu"? Miałem ten błąd (z innej klasy) i udało mi się utworzyć interfejs, który miał tę klasę określoną jako jego atrybut CoClass, i zadziałało. Tak jak w odpowiedzi Michaela Gustusa poniżej, interfejs dla BlahClass był po prostu nazywany Blah, który wydaje się być standardową konwencją. –

31

Rozszerzanie poprawnej odpowiedzi Jona.

Problem polega na tym, że łączysz nową funkcję "Osadzaj typy interopów" (lub NoPIA) za pomocą typu klasy. Funkcja "Embed Interop Types" działa zasadniczo poprzez połączenie statyczne we wszystkich typach od PIA (Primary Interop Assembly) do zespołu referencyjnego, usuwając narzut związany z jego wdrożeniem.

Ta funkcja działa doskonale dla większości typów w PIA, ale ma ograniczenia. Jedną z nich jest to, że nie można osadzać klas (jest to problem serwisowy). Misha posiada szczegółowy wpis na blogu o tym, dlaczego nie jest to dozwolone

98

jak Jan Zajęło mi trochę czasu, aby dostać .. = S Więc dla każdego, kto jest zaślepiony z frustracji.

  • Kliknij prawym przyciskiem zespołu popełniającego dodany w oknie Solution Explorer w ramach projektu Referencje. (W moim przypadku WIA)
  • Właściwości kliknięcia.
  • I tam powinna być opcja tam dla Osadź Zgromadzenie Interopowe.
  • Ustaw ją na false
+14

Ciągle walczę, dopóki nie zorientowałem się, że musisz ** kliknąć prawym przyciskiem myszy na zespole współdziałającym ** pod projektem Referencje w Eksploratorze rozwiązań, ** NIE ** na zespole, który budujesz! – SteveWilkinson

415

W większości przypadków ten błąd jest wynikiem kodu, który próbuje utworzyć wystąpienia obiektu COM. Na przykład, o to fragment kodu uruchamiania programu Excel:

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

Zazwyczaj w .NET 4 wystarczy usunąć przyrostek „klasa” i skompilować kod:

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

MSDN wyjaśnienie to here.

+10

+1 Sądzę, że właśnie to komunikat o błędzie mówi, kiedy należy użyć "odpowiedniego interfejsu". Zauważ, że Excel.Application to interfejs (mimo że można go utworzyć za pomocą nowego słowa kluczowego, podobnie do sytuacji opisanej tutaj: http: // stackoverflow.com/questions/6960910/what-does-the-c-sharp-coclass-attribute-do) –

+0

_ "Embed Interop Types" _ to ** "False" ** lub ** "True" **? – Kiquenet

+1

@Kiquenet, jeśli zastosujesz się do tej porady, możesz ustawić "Embed Interop Types" z powrotem na True, lub przynajmniej to działa dobrze dla mnie –

12

Got rozwiązanie

przejść do referencji kliknij prawym przyciskiem myszy żądany dll dostaniesz opcję „Typy HTML Interop” na „fałsz” lub „True”.

+1

To również działało dla VS2015 C# z .net przy użyciu PP_COM_Wrapper; podane w http://www.cypress.com Przykład Cypress Semiconductor Corporation C# Lib. Ustawienie na False pozbyło się błędu. – user3564895

1

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

Ten błąd występuje, ponieważ wartość domyślna to prawdziwe dla HTML Interop rodzaje nieruchomości zespołu TestStand API Interop wskazanej w nowym projekcie. Aby rozwiązać ten problem, zmień wartość właściwości Osadzaj Interop Types na False, wykonując następujące kroki: Wybierz odwołanie do zestawu odwołania testu testowego i odwołanie do sekcji odniesienia projektu w eksploratorze rozwiązań. Znajdź rodzaje nieruchomości HTML Interop w przeglądarce właściwości i zmienić wartość na false

2

Miałem ten sam problem w VB.NET 2013 z Office 2007, a to rozwiązuje go:

VS 2013 VB.NET projektu > Rekwizyty> Odnośniki> Obiekt Microsoft Word 12.0 Lib> Embed Typy interopów: zmień True na False

7

Wpadłem na ten problem podczas rozwijania projektu TFS na mojej maszynie lokalnej. Podobno działał dobrze na maszynie tego faceta, który ją napisał. Ja po prostu zmienił ten ...

WshShellClass shellClass = new WshShellClass(); 

do tego ...

WshShell shellClass = new WshShell(); 

Teraz działa jak mistrz!

+1

To podejście zadziałało także dla mnie! W moim przypadku debugowałem, aby znaleźć miejsce, w którym potrzebna była wartość, kliknąłem prawym przyciskiem i wybrałem "wyrażenie kopiowania". To, co mi dano, to "... HTMLDocumentClass ..." Usunięcie tekstu "Klasy" z niego rozwiązało problem. – majestzim

17

Oto gdzie można ustawić HTML Interop w Visual Studio 2012

enter image description here

Powiązane problemy