/link (C#-Compileroptionen)

Bewirkt, dass der Compiler dem Projekt, das Sie gerade kompilieren, COM-Typinformationen in den angegebenen Assemblys bereitstellt.

/link:fileList
// -or-
/l:fileList

Argumente

  • fileList
    Erforderlich. Durch Kommas getrennte Liste von Assemblydateinamen. Wenn der Dateiname ein Leerzeichen enthält, schließen Sie den Namen in Anführungszeichen ein.

Hinweise

Die /link-Option aktiviert das Bereitstellen einer Anwendung mit eingebetteten Typinformationen. Die Anwendung kann dann in einer Laufzeitassembly Typen verwenden, die die eingebetteten Typinformationen implementieren, und benötigt keinen Verweis auf die Laufzeitassembly. Wenn verschiedene Versionen der Laufzeitassembly veröffentlicht werden, können die unterschiedlichen Versionen von der Anwendung mit den eingebetteten Typinformationen verwendet werden, ohne dass eine Neukompilierung erforderlich ist. Ein Beispiel finden Sie unter Exemplarische Vorgehensweise: Einbetten von Typen aus verwalteten Assemblys (C# und Visual Basic).

Die Verwendung der /link-Option ist insbesondere bei der Arbeit mit COM‑Interop nützlich. Sie können COM-Typen einbetten, sodass auf dem Zielcomputer keine primäre Interopassembly (Primary Interop Assembly, PIA) mehr für die Anwendung erforderlich ist. Die /link-Option weist den Compiler an, die COM-Typinformationen aus der Interopassembly, auf die verwiesen wird, in den resultierenden kompilierten Code einzubetten. Der COM-Typ wird vom CLSID (GUID)-Wert bezeichnet. Daher kann die Anwendung auf einem Zielcomputer ausgeführt werden, auf dem dieselben COM-Typen mit denselben CLSID-Werten installiert sind. Ein gutes Beispiel sind Anwendungen, die Microsoft Office automatisieren. Da Anwendungen wie Office normalerweise in verschiedenen Versionen denselben CLSID-Wert beibehalten, kann die Anwendung die COM-Typen verwenden, auf die verwiesen wird, sofern.NET Framework 4 oder höher auf dem Zielcomputer installiert ist und die Anwendung Methoden, Eigenschaften oder Ereignisse verwendet, die in den COM-Typen enthalten sind, auf die verwiesen wird.

Die /link-Option bettet nur Schnittstellen, Strukturen und Delegaten ein. Das Einbetten von COM-Klassen wird nicht unterstützt.

Tipp

Wenn Sie im Code eine Instanz eines eingebetteten COM-Typs erstellen, müssen Sie die Instanz mit der entsprechenden Schnittstelle erstellen. Der Versuch, mit CoClass eine Instanz eines eingebetteten COM-Typs zu erstellen, führt zu einem Fehler.

Um die /link-Option in Visual Studio festzulegen, fügen Sie einen Assemblyverweis hinzu, und legen Sie die Embed Interop Types-Eigenschaft auf true fest. Der Standardwert für die Embed Interop Types-Eigenschaft ist false.

Wenn Sie eine Verknüpfung mit einer COM-Assembly (Assembly A) herstellen, die wiederum auf eine andere COM-Assembly (Assembly B) verweist, müssen Sie auch eine Verknüpfung mit Assembly B herstellen, wenn eine der folgenden Voraussetzungen erfüllt ist:

  • Ein für Assembly A verwendeter Typ erbt von einem Typ oder implementiert eine Schnittstelle von Assembly B.

  • Ein Feld, eine Eigenschaft, ein Ereignis oder eine Methode mit einem Rückgabe- oder Parametertyp aus Assembly B wird aufgerufen.

Ebenso wie die /reference-Compileroption verwendet die /link-Compileroption die Antwortdatei Csc.rsp, die auf häufig verwendete .NET Framework-Assemblys verweist. Verwenden Sie die /noconfig-Compileroption, wenn der Compiler die Datei Csc.rsp nicht verwenden soll.

Die Kurzform von /link ist /l.

Generika und eingebettete Typen

In den folgenden Abschnitten werden die Einschränkungen für die Verwendung von generischen Typen in Anwendungen beschrieben, die Interop-Typen einbetten.

Generische Schnittstellen

Generische Schnittstellen, die von einer Interopassembly eingebettet werden, können nicht verwendet werden. Dies wird im folgenden Beispiel gezeigt.

// The following code causes an error if ISampleInterface is an embedded interop type.
ISampleInterface<SampleType> sample;

Typen mit generischen Parametern

Typen mit einem generischen Parameter, dessen Typ von einer Interopassembly eingebettet wird, können nicht verwendet werden, wenn dieser Typ aus einer externen Assembly stammt. Diese Einschränkung gilt nicht für Schnittstellen. Betrachten Sie z. B. die Range-Schnittstelle, die in der Microsoft.Office.Interop.Excel-Assembly definiert wird. Wenn eine Bibliothek Interop-Typen aus der Microsoft.Office.Interop.Excel-Assembly einbettet und eine Methode verfügbar macht, die einen generischen Typ mit einem Parameter zurückgibt, dessen Typ die Range-Schnittstelle ist, muss diese Methode eine generische Schnittstelle zurückgeben, wie im folgenden Codebeispiel gezeigt.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Excel;

public class Utility
{
    // The following code causes an error when called by a client assembly.
    public List<Range> GetRange1() {


...


}

// The following code is valid for calls from a client assembly.
public IList<Range> GetRange2() {


...


    }
}

Im folgenden Beispiel kann der Clientcode die Methode aufrufen, die die generische IList-Schnittstelle zurückgibt, ohne dass ein Fehler auftritt.

public class Client
{
    public void Main()
    {
        Utility util = new Utility();

        // The following code causes an error.
        List<Range> rangeList1 = util.GetRange1();

        // The following code is valid.
        List<Range> rangeList2 = (List<Range>)util.GetRange2();
    }
}

Beispiel

Im folgenden Code werden die Quelldatei OfficeApp.cs und Verweisassemblys aus COMData1.dll und COMData2.dll kompiliert, um OfficeApp.exe zu erstellen.

csc /link:COMData1.dll,COMData2.dll /out:OfficeApp.exe OfficeApp.cs

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Einbetten von Typen aus verwalteten Assemblys (C# und Visual Basic)

Referenz

/reference (C#-Compileroptionen)

/noconfig (C#-Compileroptionen)

Überblick über die Interoperabilität (C#-Programmierhandbuch)

Konzepte

Erstellen über die Befehlszeile mit csc.exe

Weitere Ressourcen

C#-Compileroptionen