Was ist der Unterschied zwischen der Einstellung "Interop-Typen einbetten" in Visual Studio "true" und "false"?

121

Wenn Sie in Visual Studio einen Verweis auf das Projekt hinzufügen, hat das Eigenschaftenfenster eine Option Embed Inteop Types. Sollten wir diese Option auf Trueoder setzen False? Was ist der Unterschied?

Da wir viele Projekte haben, von denen einige auf Bezug genommen wurden, auf die Falseandere gesetzt wurden, Trueist es total durcheinander. Und der Bulid-Server hat auch die gleichen Warnungen:

Was bedeutet "Verweis auf eingebettete Interop-Assembly erstellt"?

Also haben wir alle zu ändern , den Plan Embed Inteop Typeszu Falsewürde, was Risiko bekommen wir?

Jerry Bian
quelle
4
Tun Sie dies niemals, es ist eine großartige Funktion, die lästige Bereitstellungsdetails löst. Sie müssen COM verstehen, um wirklich zu verstehen, worum es geht.
Hans Passant
@HansPassant, sagst du, sie niemals einstellen falseoder ändern (z. B. wenn sie standardmäßig falsebereits aktiviert sind )?
Noelicus
2
Er plant, es auf Falsch zu setzen. Mach das niemals.
Hans Passant
3
@ HansPassant wie kommt es, dass du lästig und grok benutzt. es ist sehr brüchig: D
Mafii
4
@ Mafii Ich dachte, Grok sei von Stranger in einem seltsamen Land (das amerikanisch ist). Das heißt natürlich nicht, dass die Briten es nicht mehr benutzen könnten!
UuDdLrLrSs

Antworten:

79

Diese Option wurde eingeführt, um die Notwendigkeit zu beseitigen, sehr große PIAs (Primary Interop Assemblies) für Interop bereitzustellen.

Es wird einfach der verwendete verwaltete Bridging-Code eingebettet, mit dem Sie mit nicht verwalteten Assemblys kommunizieren können. Statt alles einzubetten, werden nur die Inhalte erstellt, die Sie tatsächlich im Code verwenden.

Lesen Sie mehr in Scott Hanselman Blog - Post über sie und andere VS Verbesserungen hier .

Ich bin mir nicht sicher, ob dies empfohlen wird oder nicht, da ich diese Funktion nicht verwenden muss. Eine schnelle Websuche liefert einige Hinweise:

Das einzige Risiko, sie alle auf false zu setzen, besteht in größeren Bedenken hinsichtlich der Bereitstellung von PIA-Dateien und einer größeren Bereitstellung, wenn einige dieser Dateien groß sind.

Adam Houldsworth
quelle
1
Beachten Sie, dass es einen ziemlich signifikanten Unterschied gibt, der den vorhandenen Code beschädigen kann, wenn Sie Interop-Typen einbetten deaktivieren . Der Unterschied wird hier erwähnt : „C # 4 und spätere Versionen konvertieren das zurückgegebene Objekt automatisch in dynamisch, wenn die Assembly von der Compileroption / link referenziert wird oder wenn die Eigenschaft Excel Embed Interop Types auf true gesetzt ist. True ist der Standardwert für diese Eigenschaft. “
Dirk Vollmar
8

Ich habe festgestellt, dass ich den Wert eines Elements mithilfe des Debuggers anzeigen kann, wenn es auf false gesetzt ist. Als es auf true gesetzt wurde, wurde eine Fehlermeldung angezeigt - item.FullName.GetValue Der eingebettete Interop-Typ 'FullName' enthält keine Definition für 'QBFC11Lib.IItemInventoryRet', da er in der kompilierten Assembly nicht verwendet wurde. Ziehen Sie in Betracht, ein Objekt umzuwandeln oder die Eigenschaft 'Interop-Typen einbetten' in true zu ändern.

user890332
quelle