it-swarm.com.de

Interoptyp kann nicht eingebettet werden

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 die folgende Fehlermeldung angezeigt:

Der Interoptyp 'ActiveHomeScriptLib.ActiveHomeClass' kann nicht eingebettet werden. Verwenden Sie stattdessen die entsprechende Schnittstelle.

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

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

638
Jan

Mit .NET 4.0 können primäre Interop-Assemblys (oder vielmehr 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 das scheint für Sie kein Problem zu sein. Öffnen Sie einfach die Registerkarte Eigenschaften für die Assembly in Visual Studio 2010 und setzen Sie "Interoptypen einbetten" auf "Falsch".

BEARBEITEN: Siehe auch Michael Gustus Antwort . Entfernen Sie das Class-Suffix von den Typen, die Sie verwenden.

1023
Jon Skeet

In den meisten Fällen ist dieser Fehler das Ergebnis von Code, der versucht, ein COM-Objekt zu instanziieren. Hier ist zum Beispiel ein Code, mit dem Excel gestartet wird:

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

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

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

Eine MSDN-Erklärung lautet hier .

466
Michael Gustus

Wie Jan Ich habe eine Weile gebraucht, um es zu bekommen. = S Also für alle anderen, die vor Frustration geblendet sind.

  • Klicken Sie mit der rechten Maustaste auf die fehlerhafte Assembly, die Sie im Projektmappen-Explorer unter Ihrem Projekt hinzugefügt haben Referenzen. (In meinem Fall WIA)
  • Klicken Sie auf Eigenschaften.
  • Und dort sollte die Option für Embed Interop Assembly. sein
  • Setzen Sie es auf False
115
gideon

Erweitere Jons richtige Antwort.

Das Problem hierbei ist, dass Sie die neue Funktion "Interoptypen einbetten" (oder NoPIA) mit der Verwendung eines Klassentyps kombinieren. Mit der Funktion "Interoptypen einbetten" werden im Wesentlichen alle Typen von einer PIA (Primary Interop Assembly) statisch in die referenzierende Assembly verknüpft, sodass der Aufwand für die Bereitstellung entfällt.

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

32
JaredPar

Hier können Sie die Interop-Einbettung in Visual Studio 2012 festlegen

enter image description here

29
VK_217

Habe die Lösung

Klicken Sie mit der rechten Maustaste auf die gewünschte DLL, um die Option "Interoptypen einbetten" auf "Falsch" oder "Richtig" zu setzen.

12
Navdeep

Ich bin auf dieses Problem gestoßen, als ich ein TFS-Projekt auf meinen lokalen Computer heruntergeladen habe. Angeblich hat es auf der Maschine des Mannes, der es geschrieben hat, einwandfrei funktioniert. Ich habe das einfach geändert ...

WshShellClass shellClass = new WshShellClass();

Um dies ...

WshShell shellClass = new WshShell();

Jetzt funktioniert es wie ein Champion!

9
Zach

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

VS 2013 VB.NET-Projekt> Requisiten> Verweise> Microsoft Word 12.0-Objektbibliothek> Interoptypen einbetten: Ändern Sie Wahr in Falsch

2
Doug Null

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

Dieser Fehler tritt auf, weil der Standardwert für die Eigenschaft "Interoptypen 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 "Interoptypen einbetten" im Eigenschaftenbrowser und ändern Sie den Wert in "Falsch"

1
Ramezani r

Visual Studio 2017 Version 15.8 ermöglichte die Verwendung der PackageReferences-Syntax , um auf NuGet-Pakete in VSIX-Projekten (Visual Studio Extensibility) zu verweisen. Dies macht es viel einfacher, über NuGet-Pakete nachzudenken, und öffnet die Tür für ein vollständiges Metapaket, das die gesamte VSSDK enthält.

Die Installation unter dem NuGet-Paket behebt das Problem mit EmbedInteropTypes .

Installationspaket Microsoft.VisualStudio.SDK.EmbedInteropTypes

0
Rahul