Frage

Es ist möglicherweise im gerade hier etwas fehlt, aber, wenn ich einen Code für Excel Interop schreiben, ist hier, wie es geht.

  • ich einen Verweis auf die Bibliotheken Excel Com hinzuzufügen.
  • VS erstellt eine PIA -. Microsoft.Office.Interop.Excel .... (? Via TlbImp rechts)
  • Ich kopiere die exe und die Interop (PIA) dll zu jeder Maschine (mit .net) und es funktioniert?

Gibt es ein Szenario, in dem ich hätte, um die PIA deploy / registrieren? Oder ich habe hier etwas nicht stimmt, weil es mir scheint, die PIA in die Hauptbaugruppe Einbettung nicht wie eine große Feature scheinen?

Bitte entschuldigen Sie meine Unwissenheit, wenn überhaupt.


Update:
Also habe ich ein paar Tests habe, habe ich eine App, die excel „Hallo“ in einer Zelle öffnet fügt und speichert die Datei.

Ich baute es auf meiner Win7 Dev Maschine mit Office 2003 installiert ist (also ich referenzierten 2003 Libs). Interessanterweise eingebettet, ohne die PIA die App ist 9KB (die Gesamt bis 1.32MB des 3 PIA). Mit Embedded-PIA die exe ist 13KB .

Zweitens mit PIA eingebettet ist, arbeitete die App auf einem Computer mit Office 2007 und 2010. und ohne Embedded-PIA, auf WinXP + Office2007 es nur nicht, wenn die PIA waren nicht im Verzeichnis der exe.

Also ich denke, was Methode, gibt es eine Art dynamische Auflösung? Und warum hat es ohne die PIA im exe-Verzeichnis auf einem Win7 arbeiten, aber auf WinXP scheiterte es (nur, wenn die PIA nicht die dir in der exe war), hat die Win7-Box hat die prolly eingesetzt global PIA oder etwas?

Danke
Gideon

War es hilfreich?

Lösung

Es ist nicht so häufig braucht eigentlich eine PIA. Sie haben einen haben, wenn Sie irgendwelche Interop-Typen aus der Typbibliothek Excel belichten in einem Ihrer öffentlichen Klassen. Dies geht falsch, wenn ein anderer Code Ihre Klasse verwendet, und nicht die gleiche Interop-Bibliothek verwenden. Ein Typ in .NET ist nur identisch, wenn sie aus der gleichen Versammlung kamen. Sie würden erhalten eine schwierige Fehlermeldung wie „CAST Application to Application kann nicht“ zu interpretieren. Der PIA stellt sicher, dass alle die gleiche Art verwendet. Solange jeder ist mit der gleichen PIA-Version, die an sich schon ein schwieriges Problem ist. Bereitstellen DLL Ihre eigene Interop zusammen mit Ihrer App ist in Ordnung, wenn Sie dies vermeiden können. Das ist nicht schwer, in den meisten Szenarien.

Dieses Problem wurde in .NET 4.0 über eine Funktion namens ‚Typ Gleichwertigkeit‘ gelöst. Es ist spezifisch für COM Schnittstellentypen, die CLR sie kompatibel betrachtet, wenn sie die gleiche [Guid] und die gleiche Erklärung, unabhängig, was sie Assembly enthält. Dies wurde dann von Vorteil, mit dem Merkmal (wie bei ‚kein pia‘) ‚Interop-Typen einbetten‘ genommen, der Compiler bettet die Interop-Typen in den Metadaten der Assembly. Nur die, die Sie tatsächlich nutzen.

So Sie nicht über die Interop-Bibliothek versenden müssen mehr und brauchen nicht die PIA. Und es ist viel kleiner, da Sie nur für die Typen zahlen Sie tatsächlich nutzen. Das ist ein Los von bang for the buck, dringend empfohlen.

Andere Tipps

Ich habe nicht viel Interop selbst getan, aber ich glaube, dass:

  • Manchmal kann die PIA ziemlich groß sein; wenn die App selbst ist recht klein ist, kann die PIA es Zwerg
  • Die No-PIA-Ansatz ist flexibler in Bezug auf die Versionierung: solange Sie nur die Mitglieder von der Version des COM-Objekts zur Verfügung gestellt benutzen, die ist wirklich zur Verfügung gestellt, du bist in Ordnung .. ., während ich mit dem PIA-Ansatz denkt, müssen Sie die PIA für die gleiche Version des COM-Objekts mit dem auf der Zielmaschine
  • verwenden

Eines der wichtigsten Dinge über NoPIA zu verstehen ist, dass es nicht die PIA in der Assembly nicht embedd sondern bettet nur den Teil des PIA, dass Ihre Anwendung verwendet. Er tut dies in einer sehr feinkörnig Weise (den ganzen Weg bis auf die Methode Ebene). Das Ergebnis ist in der Regel eine sehr deutliche Verringerung der Bereitstellung Größe Ihrer Anwendung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top