/link (Opciones del compilador de C#)

Hace que el compilador facilite la información de tipos COM presente en los ensamblados especificados al proyecto que se compila actualmente.

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

Argumentos

  • fileList
    Obligatorio. Lista delimitada por comas de nombres de archivos de ensamblado. Si el nombre de archivo contiene un espacio, incluya el nombre entre comillas.

Comentarios

La opción /link permite implementar una aplicación que contiene información de tipos incrustada. La aplicación puede entonces usar los tipos de un ensamblado del runtime que implementan la información de tipos incrustada sin necesidad de una referencia al ensamblado del runtime. Si se publican varias versiones del ensamblado del runtime, la aplicación que contiene la información de tipos incrustada puede funcionar con las diferentes versiones sin que sea necesario volver a compilarla. Para obtener un ejemplo, vea Tutorial: Incrustar los tipos de los ensamblados administrados (C# y Visual Basic).

La opción /link resulta especialmente útil cuando se trabaja con interoperabilidad COM. Puede incrustar tipos COM para que la aplicación ya no requiera un ensamblado de interoperabilidad primario (PIA) en el equipo de destino. La opción /link indica al compilador que incruste la información de tipos COM del ensamblado de interoperabilidad al que se hace referencia en el código compilado resultante. El valor de CLSID (GUID) identifica el tipo COM. Como resultado, la aplicación se puede ejecutar en un equipo de destino que tenga instalados los mismos tipos COM con los mismos valores de CLSID. Las aplicaciones que automatizan Microsoft Office son un buen ejemplo. Dado que las aplicaciones como Office suelen mantener el mismo valor de CLSID en sus distintas versiones, la aplicación puede usar los tipos COM a los que se hace referencia siempre que .NET Framework 4 o posterior se haya instalado en el equipo de destino y la aplicación use los métodos, las propiedades o los eventos incluidos en dichos tipos COM.

La opción /link incrusta solamente interfaces, estructuras y delegados. No se admite la incrustación de clases COM.

Nota

Al crear una instancia de un tipo COM incrustado en el código, deberá crear dicha instancia con la interfaz adecuada. Si se intenta crear una instancia de un tipo COM incrustado con el elemento Coclass se produce un error.

Para establecer la opción /link en Visual Studio, agregue una referencia de ensamblado y establezca la propiedad Embed Interop Types en true. El valor predeterminado de la propiedad Embed Interop Types es false.

Si se establece un vínculo con un ensamblado COM (Ensamblado A) que hace referencia a otro ensamblado COM (Ensamblado B), deberá establecer también un vínculo con el Ensamblado B si se da alguna de estas condiciones:

  • Un tipo utilizado en el Ensamblado A hereda de un tipo o implementa una interfaz del Ensamblado B.

  • Se invoca un campo, una propiedad, un evento o un método que tiene un tipo de valor devuelto o un tipo de parámetro del Ensamblado B.

Al igual que la opción del compilador /reference, la opción del compilador /link usa el archivo de respuesta Csc.rsp, que hace referencia a los ensamblados de .NET Framework que se usan con frecuencia. Use la opción del compilador /noconfig si no desea que el compilador use el archivo Csc.rsp.

La forma corta de /link es /l.

Tipos incrustados y genéricos

En las secciones siguientes se describen las limitaciones al usar tipos genéricos en las aplicaciones que incrustan tipos de interoperabilidad.

Interfaces genéricas

No se pueden usar interfaces genéricas que se incrustan desde un ensamblado de interoperabilidad. El ejemplo siguiente muestra esta opción.

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

Tipos con parámetros genéricos

Los tipos que tienen un parámetro genérico cuyo tipo se incrusta desde un ensamblado de interoperabilidad no se pueden usar si dicho tipo pertenece a un ensamblado externo. Esta restricción no se aplica a las interfaces. Por ejemplo, considere la interfaz Range que se define en el ensamblado Microsoft.Office.Interop.Excel. Si una biblioteca incrusta tipos de interoperabilidad del ensamblado Microsoft.Office.Interop.Excel y expone un método que devuelve un tipo genérico con un parámetro cuyo tipo es la interfaz Range, ese método debe devolver una interfaz genérica, como se muestra en el ejemplo de código siguiente.

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() {


...


    }
}

En el ejemplo siguiente, el código de cliente puede llamar al método que devuelve la interfaz genérica IList sin errores.

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();
    }
}

Ejemplo

El código siguiente compila el archivo de código fuente OfficeApp.cs y los ensamblados de referencia de COMData1.dll y COMData2.dll para generar OfficeApp.exe.

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

Vea también

Tareas

Tutorial: Incrustar los tipos de los ensamblados administrados (C# y Visual Basic)

Referencia

/reference (Opciones del compilador de C#)

/noconfig (Opciones del compilador de C#)

Información general sobre interoperabilidad (Guía de programación de C#)

Conceptos

Compilar la línea de comandos con csc.exe

Otros recursos

Opciones del compilador de C#