Freigeben über


Generieren primärer Interop-Assemblies

Es gibt zwei Möglichkeiten für das Generieren einer primären Interop-Assembly:

Sie benötigen ein kryptographisches Schlüsselpaar, um die Assembly mit einem starken Namen zu signieren. Weitere Informationen finden Sie unter Erstellen eines Schlüsselpaars.

Verwenden des Typbibliothekimporters

Das Erstellen einer primären Interop-Assembly ist sehr einfach, wenn mit Hilfe von Tlbimp.exe eine Typbibliothek importiert wird. Tlbimp.exe bietet die folgenden Sicherheitsfunktionen:

  • Vor dem Erstellen neuer Interop-Assemblies für geschachtelte Typbibliotheksverweise wird überprüft, ob bereits andere registrierte primäre Interop-Assemblies vorhanden sind.
  • Es wird keine primäre Interop-Assembly erstellt, wenn Sie für den starken Namen der Interop-Assembly nicht entweder den Container oder den Dateinamen angeben.
  • Es wird keine primäre Interop-Assembly erstellt, wenn Sie Verweise auf abhängige Assemblies auslassen.
  • Es wird keine primäre Interop-Assembly erstellt, wenn Sie Verweise auf abhängige Assemblies hinzufügen, die keine primären Interop-Assemblies sind.

So generieren Sie eine primäre Interop-Assembly mit Hilfe von "Tlbimp.exe"

  • Geben Sie an der Eingabeaufforderung Folgendes ein:

    tlbimp tlbdatei **/primary /keyfile:**dateiname **/out:**assemblyname

    Bei diesem Befehl ist tlbdatei die Datei mit der COM-Typbibliothek, dateiname der Name des Containers oder der Datei mit dem Schlüsselpaar und assemblyname der Name der Assembly, die mit einem starken Namen signiert wird.

Im folgenden Beispiel wird die COM-Typbibliothek LibUtil.tlb importiert und die Assembly LibUtil.dll mit Hilfe der Schlüsseldatei CompanyA.snk mit einem starken Namen signiert. Da kein Namespacename angegeben wird, wird in diesem Beispiel der Standardnamespace LibUtil erstellt.

tlbimp LibUtil.tlb /primary /keyfile:CompanyA.snk /out:LibUtil.dll

Zum Zuweisen eines aussagekräftigen Namens (mit der Benennungsrichtlinie Herstellername.Bibliotheksname) werden im folgenden Beispiel der Dateiname der Standardassembly und der Namespacename überschrieben.

tlbimp LibUtil.tlb /primary /keyfile:CompanyA.snk /namespace:CompanyA.LibUtil /out:CompanyA.LibUtil.dll

Primäre Interop-Assemblies können nur auf andere primäre Interop-Assemblies verweisen. Wenn die Assembly auf Typen aus einer COM-Typbibliothek von Drittanbietern verweist, müssen Sie vom Publisher eine primäre Interop-Assembly erwerben, bevor Sie eine eigene primäre Interop-Assembly generieren können. Wenn Sie selbst der Publisher sind, müssen Sie eine primäre Interop-Assembly für die abhängige Typbibliothek erstellen, bevor Sie die verweisende primäre Interop-Assembly generieren können.

Im folgenden Beispiel wird MyLib.tlb importiert, die auf CompanyA.LibUtil.dll verweist, und die Assembly CompanyB.MyLib.dll wird mit Hilfe der Schlüsseldatei CompanyB.snk mit einem starken Namen signiert. Der Namespace, CompanyB.MyLib, überschreibt den Standardnamespacenamen.

tlbimp MyLib.tlb /primary /keyfile:CompanyB.snk /namespace:CompanyB.MyLib /reference:CompanyA.LibUtil.dll /out:CompanyB.MyLib.dll

Eine abhängige primäre Interop-Assembly mit einer anderen Versionsnummer als die ursprüngliche Typbibliothek kann nicht ermittelt werden, wenn sie im aktuellen Verzeichnis installiert wird. Sie müssen die abhängige primäre Interop-Assembly entweder in der Windows-Registrierung registrieren oder mit Hilfe der Option /reference sicherstellen, dass Tlbimp.exe die abhängige DLL findet.

Sie können auch mehrere Versionen einer Typbibliothek einbinden. Sie können z. B. angeben, dass eine primäre Interop-Assembly die Versionen 1.0 und 1.1 der Typbibliothek unterstützt.

So binden Sie mehrere Versionen einer Typbibliothek ein

  1. Importieren Sie mit dem zuvor beschriebenen Verfahren eine Typbibliotheksdatei:

    tlbimp LibUtil.tlb /primary /keyfile:CompanyA.snk /out:LibUtil.dll
    
  2. Erstellen Sie aus der importierten Assembly mit dem MSIL Disassembler-Tool (Ildasm.exe) eine Textdatei:

    ildasm LibUtil.dll /out:LibUtil.il
    
  3. Fügen Sie mit einem Texteditor ein zweites PrimaryInteropAssemblyAttribute unter dem durch Tlbimp.exe hinzugefügten Attribut ein. Fügen Sie die Haupt- und Nebenversionsnummern der zweiten Version der Typbibliothek ein.

  4. Verwenden Sie den MSIL Assembler (Ilasm.exe), um aus der bearbeiteten Textdatei eine neue Assembly zu generieren und diese zu signieren:

    idasm LibUtil.il /dll /key:CompanyA.snk
    

Manuelles Erstellen primärer Interop-Assemblies

Bei einem weniger häufig verwendeten Verfahren für das Erstellen einer Typbibliothek wird die primäre Interop-Assembly manuell im Quellcode erstellt, wobei eine mit der Common Language Specification (CLS) kompatible Sprache wie C# verwendet wird. Dieser Ansatz ist sinnvoll, wenn keine Typbibliothek verfügbar ist.

So generieren Sie eine primäre Interop-Assembly im Quellcode

  1. Erstellen Sie eine Interop-Assembly im Quellcode. Entsprechende Anweisungen finden Sie unter Manuelles Erstellen eines Wrappers. 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.
  2. Wenden Sie auf Assemblyebene die folgenden Attribute an:
    1. AssemblyKeyFileAttribute oder AssemblyKeyNameAttribute, um den Namen der Datei oder des Containers mit dem Schlüsselpaar anzugeben, das beim Signieren der Assembly mit einem starken Namen verwendet werden soll.
    2. GuidAttribute, um den Bibliotheksbezeichner (LIBID) der Zieltypbibliothek anzugeben.
    3. PrimaryInteropAssemblyAttribute, um die Assembly als eine primäre Interop-Assembly zu kennzeichnen.

Im folgenden Codebeispiel wird die Schlüsseldatei CompanyA.snk auf AssemblyKeyFileAttribute angewendet und angegeben, dass diese Assembly eine primäre Interop-Assembly ist, die die Typbibliotheksversionen 4.2 und 5.2 unterstützt. Das Beispiel veranschaulicht, dass Sie mehrere Versionen einer Typbibliothek einbinden können, indem Sie zusätzliche Attribute auf Assemblyebene anwenden.

[assembly:AssemblyKeyFile(@"..\..\CompanyA.snk")]
[assembly:Guid("97d25db0-0363-1cf-abc4-02608 c9e7553"]
[assembly:PrimaryInteropAssembly(4, 2)]
[assembly:PrimaryInteropAssembly(5, 2)]

Sie können auch während des Kompiliervorgangs eine Assembly verzögert signieren. Weitere Informationen hierzu finden Sie unter Verzögertes Signieren einer Assembly.

Siehe auch

Erstellen primärer Interop-Assemblies | Benennen primärer Interop-Assemblies | Anpassen primärer Interop-Assemblies | Weitergeben primärer Interop-Assemblies an Entwickler