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?
Antworten:
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
Class
Suffix aus den von Ihnen verwendeten Typen entfernt wird.quelle
embed interop types
Eigenschaftfalse
hat den Trick gemacht. In meinem Fall arbeitete ich mit derMicrosoft.Office.Interop.Excel
Bibliothek und musste auf das Arbeitsmappenobjekt zugreifen. Die Verwendung der SchnittstelleWorkbook
(übrigens Namenskonvention ...) war keine Option - ich erhieltCOM object
, nicht die gewünschteMicrosoft.Office.Interop.Excel.WorkbookClass
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:
In .NET 4 müssen Sie normalerweise nur das Suffix 'Class' entfernen und den Code kompilieren:
Eine MSDN-Erklärung finden Sie hier .
quelle
Wie Jan Es hat eine Weile gedauert, bis ich es bekommen habe. = S Also für alle anderen, die vor Frustration geblendet sind.
quelle
Hier können Sie das Embed Interop in Visual Studio 2012 festlegen
quelle
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
quelle
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".
quelle
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 ...
Dazu ...
Jetzt funktioniert es wie ein Champion!
quelle
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
quelle
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
quelle
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 .
quelle