Der Interop-Typ kann nicht eingebettet werden

666

Ich erstelle eine Webanwendung auf dem .NET 4.0-Framework (Beta2) in C #.

Wenn ich versuche, eine Assembly mit dem Namen "ActiveHomeScriptLib" zu verwenden, wird folgende Fehlermeldung angezeigt:

Der Interop-Typ 'ActiveHomeScriptLib.ActiveHomeClass' kann nicht eingebettet werden. Verwenden Sie stattdessen die entsprechende Schnittstelle.

Wenn ich das Framework auf Version 3.5 ändere, habe ich keine Fehler.

Was ist ein Interop-Typ und warum tritt dies nur auf, wenn ich das 4.0-Framework verwende?

Jan.
quelle
Ich fand diesen Artikel sehr hilfreich bei der Lösung von Interop / PIA-Problemen. blogs.msdn.com/b/vbteam/archive/2010/06/11/…
GilesDMiddleton

Antworten:

1066

Mit .NET 4.0 können primäre Interop-Assemblys (oder besser gesagt die Teile davon, die Sie benötigen) in Ihre Assembly eingebettet werden, sodass Sie sie nicht zusammen mit Ihrer Anwendung bereitstellen müssen.

Aus irgendeinem Grund kann diese Assembly nicht eingebettet werden - aber es scheint, dass dies für Sie kein Problem ist. Öffnen Sie einfach die Registerkarte Eigenschaften für die Assembly in Visual Studio 2010 und setzen Sie "Interop-Typen einbetten" auf "Falsch".

BEARBEITEN: Siehe auch die Antwort von Michael Gustus , bei der das ClassSuffix aus den von Ihnen verwendeten Typen entfernt wird.

Jon Skeet
quelle
2
Leider klingt dies genau so, wie ich es brauche, aber diese Eigenschaft scheint nicht mehr verfügbar zu sein.
Dave
130
Ich habe auf der Eigenschaftenseite des Projekts gesucht, anstatt mit der rechten Maustaste auf | zu klicken Eigenschaften der betroffenen DLL im Bereich Referenzen.
JustSteve
5
Wäre es nicht sinnvoller, das zu tun, was der Fehler sagt, und "die entsprechende Schnittstelle zu verwenden"? Ich hatte diesen Fehler (von einer anderen Klasse) und konnte eine Schnittstelle instanziieren, deren Klasse als CoClass-Attribut angegeben war, und es funktionierte. Wie in der Antwort von Michael Gustus unten wurde die Schnittstelle für BlahClass nur Blah genannt, was die Standardkonvention zu sein scheint.
Tim Goodman
1
Eine großartige Sache beim Einbetten ist, dass die Interop-Assembly CopyLocal = False bleiben kann, da Sie sie zur Laufzeit nicht benötigen.
Schmuli
@ TimGoodman für mich "anwendbare Schnittstelle" funktionierte nicht, aber das Setzen der oben genannten embed interop typesEigenschaft falsehat den Trick gemacht. In meinem Fall arbeitete ich mit der Microsoft.Office.Interop.ExcelBibliothek und musste auf das Arbeitsmappenobjekt zugreifen. Die Verwendung der Schnittstelle Workbook(übrigens Namenskonvention ...) war keine Option - ich erhielt COM object, nicht die gewünschteMicrosoft.Office.Interop.Excel.WorkbookClass
Prokurors
483

In den meisten Fällen ist dieser Fehler das Ergebnis von Code, der versucht, ein COM-Objekt zu instanziieren. Hier ist zum Beispiel ein Teil des Codes, der Excel startet:

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

In .NET 4 müssen Sie normalerweise nur das Suffix 'Class' entfernen und den Code kompilieren:

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

Eine MSDN-Erklärung finden Sie hier .

Michael Gustus
quelle
16
+1 Ich glaube, das ist es, was die Fehlermeldung Ihnen tatsächlich sagt, wenn Sie sagen "Verwenden Sie die entsprechende Schnittstelle". Beachten Sie, dass Excel.Application eine Schnittstelle ist (trotz der Tatsache, dass es mit dem neuen Schlüsselwort instanziiert werden kann, ähnlich der hier beschriebenen Situation: stackoverflow.com/questions/6960910/… )
Tim Goodman
"Interop-Typen einbetten" in "False" oder "True" ?
Kiquenet
1
@Kiquenet Wenn Sie den Ratschlägen hier folgen, können Sie die 'Embed Interop Types' wieder auf True setzen, oder zumindest hat das für mich in Ordnung funktioniert
Sam Holder
122

Wie Jan Es hat eine Weile gedauert, bis ich es bekommen habe. = S Also für alle anderen, die vor Frustration geblendet sind.

  • Rechtsklick auf die säumige Versammlung , dass Sie in der Lösung Explorer unter Ihrem Projekt hinzugefügt Referenzen . (In meinem Fall WIA)
  • Klicken Sie auf Eigenschaften.
  • Und dort sollte es die Option für Interop Assembly einbetten geben.
  • Setzen Sie es auf False
Gideon
quelle
15
Ich habe immer noch Probleme, bis mir klar wurde, dass Sie mit der rechten Maustaste auf die Interop-Assembly unter den Projektreferenzen im Projektmappen-Explorer klicken müssen , NICHT auf die Assembly, die Sie erstellen !
Steve Wilkinson
2
Jetzt (zehn Jahre später) heißt diese Option "Interop-Typen einbetten"
David Foley
36

Hier können Sie das Embed Interop in Visual Studio 2012 festlegen

Geben Sie hier die Bildbeschreibung ein

VK_217
quelle
34

Erweitern Sie Jons richtige Antwort.

Das Problem hierbei ist, dass Sie die neue Funktion "Interop-Typen einbetten" (oder NoPIA) mit der Verwendung eines Klassentyps kombinieren. Die Funktion "Interop-Typen einbetten" funktioniert, indem im Wesentlichen alle Typen einer PIA (Primary Interop Assembly) statisch mit der referenzierenden Assembly verknüpft werden, wodurch der Aufwand für die Bereitstellung entfällt.

Diese Funktion funktioniert für die meisten PIA-Typen hervorragend, unterliegt jedoch Einschränkungen. Eine davon ist, dass Sie keine Klassen einbetten können (dies ist ein Wartungsproblem). Mischa hat einen ausführlichen Blog-Artikel darüber, warum dies nicht erlaubt ist

JaredPar
quelle
15

Habe die Lösung

Gehen Sie zu den Referenzen, klicken Sie mit der rechten Maustaste auf die gewünschte DLL. Sie erhalten die Option "Interop-Typen einbetten" in "False" oder "True".

Navdeep
quelle
1
Dies funktionierte auch für VS2015 c # mit .net unter Verwendung von PP_COM_Wrapper. gegeben in cypress.com Cypress Semiconductor Corporation C # Lib Beispiel. Durch Setzen auf False wurde der Fehler behoben.
user3564895
9

Dieses Problem trat auf, als ich ein TFS-Projekt auf meinen lokalen Computer herunterzog. Angeblich funktionierte es gut auf der Maschine des Mannes, der es geschrieben hat. Ich habe das einfach geändert ...

WshShellClass shellClass = new WshShellClass();

Dazu ...

WshShell shellClass = new WshShell();

Jetzt funktioniert es wie ein Champion!

Zach
quelle
1
Dieser Ansatz hat auch bei mir funktioniert! In meinem Fall habe ich debuggt, um herauszufinden, wo der benötigte Wert war, mit der rechten Maustaste geklickt und "Ausdruck kopieren" ausgewählt. Was mir gegeben wurde, war "... HTMLDocumentClass ..." Das Entfernen des Textes "Klasse" daraus löste das Problem für mich.
Majestzim
3

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

VS 2013 VB.NET-Projekt> Requisiten> Refs> Microsoft Word 12.0-Objektbibliothek> Interop-Typen einbetten: Ändern Sie True in False

Doug Null
quelle
1

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

Dieser Fehler tritt auf, weil der Standardwert für die Eigenschaft "Interop-Typen einbetten" der TestStand-API-Interop-Assembly gilt, auf die im neuen Projekt verwiesen wird. Um diesen Fehler zu beheben, ändern Sie den Wert der Eigenschaft "Interop-Typen einbetten" in "Falsch", indem Sie die folgenden Schritte ausführen: Wählen Sie im Projektmappen-Explorer im Abschnitt "Referenzen" Ihres Projekts die Referenz "TestStand Interop Assembly" aus. Suchen Sie die Eigenschaft Interop-Typen einbetten im Eigenschaftenbrowser und ändern Sie den Wert in False

Ramezani r
quelle
1

Mit Visual Studio 2017 Version 15.8 konnte mithilfe der PackageReferencesyntax auf NuGet-Pakete in VSIX-Projekten (Visual Studio Extensibility) verwiesen werden. Dies macht es viel einfacher, über NuGet-Pakete nachzudenken, und öffnet die Tür für ein vollständiges Metapaket, das das gesamte VSSDK enthält.

Durch die Installation unter dem NuGet-Paket wird das EmbedInteropTypes-Problem behoben .

Installationspaket Microsoft.VisualStudio.SDK.EmbedInteropTypes

Rahul
quelle