727 Stimmen

Interop-Typ kann nicht eingebettet werden

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

Wenn ich versuche, eine Assembly namens "ActiveHomeScriptLib" zu verwenden, erhalte ich folgende Fehlermeldung:

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

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

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

1160voto

Jon Skeet Punkte 1325502

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

Aus welchen Gründen auch immer, kann diese Baugruppe 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 "Embed Interop Types" auf "False".

EDIT: Siehe auch Michael Gustus' respuesta , das Entfernen der Class Suffix aus den von Ihnen verwendeten Typen.

536voto

Michael Gustus Punkte 5229

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

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 aquí .

134voto

gideon Punkte 19091

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

  • Klicken Sie mit der rechten Maustaste auf die fehlerhafte Baugruppe, die Sie im Projektmappen-Explorer unter Ihrem Projekt hinzugefügt haben Referenzen . (In meinem Fall WIA)
  • Klicken Sie auf Eigenschaften.
  • Und es sollte die Option geben für Interop-Versammlung einbetten.
  • Auf False setzen

46voto

nobody Punkte 10430

Hier finden Sie die Einstellungen für Embed Interop in Visual Studio 2012

enter image description here

35voto

JaredPar Punkte 699699

Erweiterung der richtigen Antwort von Jon.

Das Problem dabei ist, dass Sie die neue Funktion "Embed Interop Types" (oder NoPIA) mit der Verwendung eines Klassentyps kombinieren. Die Funktion "Embed Interop Types" funktioniert im Wesentlichen durch statisches Einbinden aller Typen aus einer PIA (Primary Interop Assembly) in die referenzierende Assembly, wodurch der Overhead der Bereitstellung entfällt.

Diese Funktion eignet sich hervorragend für die meisten Arten von PIA, unterliegt jedoch gewissen Einschränkungen. Eine davon ist, dass Sie keine Klassen einbetten können (das ist ein Problem der Wartung). Misha hat einen detaillierten Blog-Artikel darüber, warum dies nicht erlaubt ist

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X