2010-03-20 16 views
559

Ich erstelle eine Webanwendung auf dem .NET 4.0-Framework (Beta2) in C#.Interop-Typ kann nicht eingebettet werden

Wenn ich versuche, eine Versammlung namens „ActiveHomeScriptLib“ zu verwenden, erhalte ich folgende Fehlermeldung:

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

Als ich den Rahmen auf Version 3.5 ändern, ich keine Fehler haben.

Was ist ein Interop Typ und warum ist dies nur dann auftreten, wenn ich die 4.0 Framework verwenden?

+0

ich diesen Artikel sehr hilfreich gefunden haben Probleme Interop/PIA zu lösen. http://blogs.msdn.com/b/vbteam/archive/2010/06/11/troubleshooting-errors-when-embedding-type-information-doug-rothaus.aspx – GilesDMiddleton

Antwort

896

4.0 ermöglicht .NET primäre Interopassemblys (oder besser gesagt, die Bits davon, dass Sie benötigen) in die Assembly eingebettet werden, damit Sie sie neben Ihrer Anwendung nicht bereitstellen müssen.

Aus welchem ​​Grunde auch immer, diese Anordnung kann nicht eingebettet werden - aber es klingt wie das für Sie kein Problem. Öffnen Sie einfach die Registerkarte Eigenschaften für die Assembly in Visual Studio 2010, und legen Sie "Interop-Typen einbetten" auf "False" fest.

EDIT: Siehe auch Michael Gustus answer, Entfernen der Class Suffix von den Typen, die Sie verwenden.

+1

Leider klingt das genau nach was ich brauche, aber diese Eigenschaft scheint nicht mehr verfügbar zu sein. – Dave

+94

Ich suchte auf der Eigenschaftsseite des Projekts statt der rechten Maustaste | Eigenschaften der betroffenen DLL im Bereich Referenzen. – justSteve

+1

Wäre es nicht sinnvoller zu machen, wie der Fehler sagt und "die entsprechende Schnittstelle zu verwenden"? Ich hatte diesen Fehler (aus einer anderen Klasse) und konnte eine Schnittstelle instanziieren, die diese Klasse als ihr CoClass-Attribut angegeben hatte, und es funktionierte. Wie in der Antwort von Michael Gustus unten wurde das Interface für BlahClass nur Blah genannt, was die Standardkonvention zu sein scheint. –

31

Erweiterung auf Jon richtige Antwort.

Das Problem hierbei ist, dass Ihr die neuen „Embed Interop-Typen“ (oder NoPIA) Funktion unter Verwendung eines Klasse-Typ kombinieren. Die Funktion "Interop-Typen einbetten" arbeitet im Wesentlichen statisch in allen Typen von einer PIA (Primary Interop Assembly) in die referenzierende Assembly, wodurch der Aufwand für die Bereitstellung entfällt.

Diese Funktion eignet sich für die meisten Typen in einem PIA, hat jedoch Einschränkungen. Eine davon ist, dass Sie Klassen nicht einbetten können (es ist ein Wartungsproblem). Mischa hat einen ausführlichen Blog-Artikel auf, warum dies nicht

erlaubt
98

wie Jan es mir dauerte eine Weile, um es zu bekommen .. = S Also für alle anderen, die mit Frustration geblendet wird.

  • Rechtsklick auf die säumige Assembly, die Sie Referenzen in der Lösung Explorer unter Ihrem Projekt hinzugefügt. (In meinem Fall WIA)
  • Klicken Sie auf Eigenschaften.
  • Und dort sollte die Option für Embed Interop Assembly sein.
  • Sets es auf False
+14

Ich kämpfe immer noch, bis ich feststellte, dass Sie ** mit der rechten Maustaste auf die Interop-Assembly ** unter dem Projekt Referenzen im Projektmappen-Explorer klicken müssen, ** NICHT ** die Baugruppe, die Sie bauen! – SteveWilkinson

415

In den meisten Fällen ist dieser Fehler das Ergebnis des Code, der ein COM-Objekt zu instanziieren versucht. Zum Beispiel, hier ist ein Stück Code Starten Excel:

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

Regel in .NET 4 Sie müssen nur die Endung 'Klasse' entfernen und den Code zu kompilieren:

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

Ein MSDN Erklärung ist here.

+10

+1 Ich glaube, das ist es, was die Fehlermeldung Ihnen sagt, wenn Sie "die entsprechende Schnittstelle verwenden" sagen. Beachten Sie, dass Excel.Application eine Schnittstelle ist (trotz der Tatsache, dass sie mit dem neuen Schlüsselwort ähnlich der hier beschriebenen Situation instanziiert werden kann: http: // stackoverflow.com/questions/6960910/what-does-the-c-sharp-coclass-attribute-do) –

+0

_ "Interop-Typen einbetten" _ zu ** "False" ** oder ** "True" **? – Kiquenet

+1

@Kiquenet Wenn Sie dem Rat hier folgen, können Sie die 'Interop-Typen einbetten' wieder auf 'True' setzen, oder zumindest hat das für mich funktioniert –

12

Haben Sie die Lösung

Zum Referenz rechts die gewünschten DLL klicken, werden Sie die Option „Embed Interop-Typen“ auf „False“ oder „True“ erhalten.

+1

Dies funktionierte auch für VS2015 C# mit .net mit PP_COM_Wrapper; gegeben in http://www.cypress.com Cypress Semiconductor Corporation C# Lib-Beispiel. Bei der Einstellung "False" wurde der Fehler behoben. – user3564895

1

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

Dieser Fehler tritt auf, weil der Standardwert gilt für die von der Teststand-API-Interop-Assembly in dem neuen Projekt verweist Embed Interop Typen Eigenschaft ist. Um diesen Fehler zu beheben, ändern Sie den Wert der Eigenschaft Einbettungs-Interop-Typen in False, indem Sie die folgenden Schritte ausführen: Wählen Sie den TestStand Interop Assembly-Verweis im Referenzabschnitt Ihres Projekts im Projektmappen-Explorer. Finden Sie die Sender integrieren Interop Typen Eigenschaft im Eigenschaftenbrowser, und ändern Sie den Wert auf False

2

hatte ich gleiche Problem in VB.NET 2013 mit Office 2007, und dies löste es:

VS 2013 VB.NET-Projekt > Props> Refs> Microsoft Word 12.0 Objekt Lib> Interop-Typen einbetten: ändern True False

7

Ich stieß auf dieses Problem beim Herunterziehen eines TFS-Projekts auf meinem lokalen Rechner. Angeblich funktionierte es gut auf der Maschine des Kerls, der es schrieb. Ich dies einfach geändert ...

WshShellClass shellClass = new WshShellClass(); 

Um dies zu ...

WshShell shellClass = new WshShell(); 

Jetzt ist es wie ein Champion zu arbeiten!

+1

Dieser Ansatz hat auch für mich funktioniert! In meinem Fall war ich Debuggen, um zu finden, wo der Wert, den ich brauchte, war mit der rechten Maustaste geklickt und "Ausdruck kopieren" ausgewählt. Was mir gegeben wurde, war "... HTMLDocumentClass ..." Das Entfernen des Textes "Class" löste das Problem für mich. – majestzim

17

Hier, wo in Visual Studio 2012 die Embed Interop setzen

enter image description here

Verwandte Themen