[COM-Objekte / PIAs] Fragen über Fragen

Klein0r

Erfahrenes Mitglied
Hallo zusammen,

ich schreibe eigentlich momentan ein kleines Tool zur Verwaltung von Excel-Makros. Dabei kommt man um das nutzen von PIAs anscheinend nicht drumherum. Und da beginnt das Problem. Ich habe gelesen, dass für eine Office-Version erstellte PIAs nicht ohne weiteres als Schnittstelle für andere Office-Versionen genutzt werden kann.

So wie ich das verstanden habe ist der einzige Zweck dieser PIAs eine Schnittstelle zwischen der alten COM-Technologie und der neuen .NET-Technik herzustellen.

Erstens:
Jetzt ist die Frage was passiert wenn ich wenn ich über Projekt - Verweis hinzufügen ein COM-Objekt hinzufüge. Werden dann automatisch die nötigen PIAs erstellt um die Kommunikation mit .NET zu gewährleisten? Also macht es einen unterschied ob ich dort die entsprechenden COM-Objekte einbinde oder mir hiermit die PIAs generieren lasse (so habe ich es bisher gemacht)?

Nun habe ich gelernt, dass man sich PIAs auch selbst genieren kann. Wie das geht steht hier geschrieben: DE - EN

Allerdings werde ich da auch noch nicht so richtig schlau draus.
Erstmal habe ich verstanden das man sich folgendermaßen einen Schlüssel generieren kann:
Um eine Assembly mit einem starken Namen zu signieren, benötigen Sie ein Schlüsselpaar, das aus einem öffentlichen und einem privaten Schlüssel besteht. Dieses kryptografische Schlüsselpaar wird während der Kompilierung zum Erstellen einer Assembly mit starkem Namen verwendet. Sie können ein Schlüsselpaar mit dem Strong Name-Tool (Sn.exe) erstellen. Schlüsselpaardateien haben in der Regel die Erweiterung .snk.
Gesagt getan:
Code:
sn -k test.snk

Danach habe ich überall gesucht wie ich mir meine PIAs für Excel selbst erstellen kann (was anderes macht diese .exe von der MS-Site ja sicherlich auch nicht). Also habe ich das Tool genommen und bin so vorgegangen wie oben beschrieben.

Nun habe ich angefangen mit dem Keyfile (was man anscheinend auch nicht immer braucht) PIAs zu erstellen. Mehr oder weniger erfolgreich.
Code:
TlbImp "C:\Programme\Microsoft Office\Office10\GRDE50.OLB" /primary /keyfile:test.snk /out:GRDE50.dll
TlbImp "C:\Programme\Microsoft Office\Office10\MSACC.OLB" /primary /keyfile:test.snk /out:MSACC.dll
TlbImp "C:\Programme\Microsoft Office\Office10\MSOUTL.OLB" /primary /keyfile:test.snk /out:MSOUTL.dll
TlbImp "C:\Programme\Microsoft Office\Office10\MSPPT.OLB" /primary /keyfile:test.snk /out:MSPPT.dll
TlbImp "C:\Programme\Microsoft Office\Office10\MSWORD.OLB" /primary /keyfile:test.snk /out:MSWORD.dll
TlbImp "C:\Programme\Microsoft Office\Office10\XL5DE32.OLB" /primary /keyfile:test.snk /out:XL5DE32.dll
TlbImp "C:\Programme\Microsoft Office\Office12\GREN50.OLB" /primary /keyfile:test.snk /out:GREN50.dll
Die Dateinamen sagen ja schon fast alles. Man findet also Excel, Powerpoint, Outlook, Word und Access dort wieder. Außerdem habe ich schon mehrere Möglichkeiten gefunden PIAs zu erstellen:
  • aus EXE-Dateien
  • aus TLB-Dateien
  • aus OLB-Dateien

Allerdings generiert mir das oben genannte Stück Quelltext nur 3 Dateien und viele Fehler:
Code:
Das Schlüsselpaar wurde in "test.snk" geschrieben.
Microsoft (R) .NET Framework Type Library to Assembly Converter 2.0.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

Type library imported to C:\Programme\Microsoft Visual Studio 8\SDK\v2.0\Bin\GRDE50.dll
Microsoft (R) .NET Framework Type Library to Assembly Converter 2.0.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

TlbImp : error TI0000 : System.ApplicationException - Referenced type library 'DAO' does not have a primary interop assembly registered.
Microsoft (R) .NET Framework Type Library to Assembly Converter 2.0.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

TlbImp : error TI0000 : System.ApplicationException - Referenced type library 'Office' does not have a primary interop assembly registered.
Microsoft (R) .NET Framework Type Library to Assembly Converter 2.0.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

TlbImp : error TI0000 : System.ApplicationException - Referenced type library 'Office' does not have a primary interop assembly registered.
Microsoft (R) .NET Framework Type Library to Assembly Converter 2.0.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

TlbImp : error TI0000 : System.ApplicationException - Referenced type library 'Office' does not have a primary interop assembly registered.
Microsoft (R) .NET Framework Type Library to Assembly Converter 2.0.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

Type library imported to C:\Programme\Microsoft Visual Studio 8\SDK\v2.0\Bin\XL5DE32.dll
Microsoft (R) .NET Framework Type Library to Assembly Converter 2.0.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

Type library imported to C:\Programme\Microsoft Visual Studio 8\SDK\v2.0\Bin\GREN50.dll
Microsoft (R) .NET Framework Type Library to Assembly Converter 2.0.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

Anscheinend kann man auch noch Referenzen mitgeben. Aber woher soll ich wissen welche Referenzen genau ich benötige?

Zweitens:
Sie können primäre Interop-Assemblys manuell im Quellcode erstellen, wobei eine mit der Common Language Specification (CLS) kompatible Sprache wie C# verwendet wird. Dieser Ansatz ist sinnvoll, wenn keine Typbibliothek verfügbar ist.

Wie soll das gehen? Diesen Beitrag habe ich schon gelesen.

Beachten Sie, dass Sie alle COM-Typen aus der ursprünglichen Typbibliothek einfügen müssen, wenn Sie eine primäre Interop-Assembly manuell erstellen.
Das heißt die COM-Typen die ich einbinde werden doch nicht automatisch zu PIAs umgewandelt?

Noch ein paar Links...

Ich sehe durch das ganze nichtmehr durch... Bitte eine kurze Aufklärung was ich richtig gesehen hab und was nicht so ganz stimmt. Ich werde absolut nicht schlau aus dem ganzen Thema. Oder habe ich etwas total falsch verstanden?

EDIT:
Jetzt verstehe ich erst das es einen Unterschied macht ob ich die generierten PIAs von Microsoft nutze oder mir das ganze selbst generiere:
Obwohl grundsätzlich jeder Entwickler, der COM-Typen aus einer .NET Framework-Anwendung verwenden möchte, eine Interop-Assembly generieren kann, führt dies in der realen Anwendung zu einem Problem. Immer wenn ein Entwickler eine COM-Typbibliothek importiert und signiert, wird ein Satz eindeutiger Typen erstellt, die mit den von anderen Entwicklern importierten und signierten Typen inkompatibel sind. Zur Vermeiden dieses Inkompatibilitätsproblems sollten alle Entwickler die vom Hersteller bereitgestellte und signierte primäre Interop-Assembly verwenden.


lg
 
Zuletzt bearbeitet:
*UP*

Kann mir niemand eine Aussage machen ob ich totalen Mist erzähle oder ob das einigermaßen richtig ist? Keiner mit der Materie vertraut? Alles umsonst geschrieben? :(

lg
 

Neue Beiträge

Zurück