-link (C# コンパイラ オプション)-link (C# Compiler Options)

指定したアセンブリ内の COM 型情報を、現在のコンパイル対象のプロジェクトで使用できるようにします。Causes the compiler to make COM type information in the specified assemblies available to the project that you are currently compiling.


// -or-  


必須です。Required. アセンブリ ファイル名のコンマ区切りリスト。Comma-delimited list of assembly file names. ファイル名に空白が含まれている場合は、名前を二重引用符で囲みます。If the file name contains a space, enclose the name in quotation marks.


-link オプションを使用すると、埋め込み型情報を含むアプリケーションを配置できます。The -link option enables you to deploy an application that has embedded type information. その後、このアプリケーションは、埋め込み型情報を実装する、ランタイム アセンブリ内の型を使用できます。その際、ランタイム アセンブリへの参照は必要ありません。The application can then use types in a runtime assembly that implement the embedded type information without requiring a reference to the runtime assembly. ランタイム アセンブリのさまざまなバージョンが公開されている場合、埋め込み型情報を含むアプリケーションは、再コンパイルする必要なく、各種バージョンで動作できます。If various versions of the runtime assembly are published, the application that contains the embedded type information can work with the various versions without having to be recompiled. 例については、「チュートリアル:マネージド アセンブリからの型の埋め込み」をご覧ください。For an example, see Walkthrough: Embedding Types from Managed Assemblies.

-link オプションの使用は、COM 相互運用を使用している場合に特に便利です。Using the -link option is especially useful when you are working with COM interop. COM 型を埋め込むことができるため、アプリケーションは、ターゲット コンピューター上にプライマリ相互運用機能アセンブリ (PIA) を必要としなくなります。You can embed COM types so that your application no longer requires a primary interop assembly (PIA) on the target computer. -link オプションを使用すると、コンパイラによって、COM 型情報は、参照先の相互運用アセンブリから結果としてコンパイルされるコードに埋め込まれます。The -link option instructs the compiler to embed the COM type information from the referenced interop assembly into the resulting compiled code. COM 型は、CLSID (GUID) 値によって識別されます。The COM type is identified by the CLSID (GUID) value. その結果、同じ CLSID 値の同じ COM 型がインストールされているターゲット コンピューターでアプリケーションを実行できます。As a result, your application can run on a target computer that has installed the same COM types with the same CLSID values. Microsoft Office を自動化するアプリケーションが良い例です。Applications that automate Microsoft Office are a good example. Office のようなアプリケーションは、通常、さまざまなバージョン間で同じ CLSID 値を保持するため、.NET Framework 4 以降がターゲット コンピューターにインストールされていて、参照先の COM 型に含まれているメソッド、プロパティ、またはイベントがアプリケーションで使用される限りは、そのアプリケーションで参照先の COM 型を使用できます。Because applications like Office usually keep the same CLSID value across different versions, your application can use the referenced COM types as long as .NET Framework 4 or later is installed on the target computer and your application uses methods, properties, or events that are included in the referenced COM types.

-link オプションで埋め込まれるのは、インターフェイス、構造体、デリゲートのみです。The -link option embeds only interfaces, structures, and delegates. COM クラスの埋め込みはサポートされていません。Embedding COM classes is not supported.


コードで埋め込み COM 型のインスタンスを作成する際は、適切なインターフェイスを使用してインスタンスを作成する必要があります。When you create an instance of an embedded COM type in your code, you must create the instance by using the appropriate interface. コクラスを使用して埋め込み COM 型のインスタンスを作成しようとすると、エラーが発生します。Attempting to create an instance of an embedded COM type by using the CoClass causes an error.

Visual Studio で -link オプションを設定するには、アセンブリ参照を追加し、Embed Interop Types プロパティを true に設定します。To set the -link option in Visual Studio, add an assembly reference and set the Embed Interop Types property to true. Embed Interop Types プロパティの既定値は false です。The default for the Embed Interop Types property is false.

別の COM アセンブリ (アセンブリ B) を参照する COM アセンブリ (アセンブリ A) にリンクする場合、次のいずれかが当てはまるときは、アセンブリ B にもリンクする必要があります。If you link to a COM assembly (Assembly A) which itself references another COM assembly (Assembly B), you also have to link to Assembly B if either of the following is true:

  • アセンブリ A の型がアセンブリ B の型から継承されているか、アセンブリ B のインターフェイスを実装する。A type from Assembly A inherits from a type or implements an interface from Assembly B.

  • アセンブリ B の戻り値の型またはパラメーターの型を使用するフィールド、プロパティ、イベント、またはメソッドが呼び出される。A field, property, event, or method that has a return type or parameter type from Assembly B is invoked.

-reference コンパイラ オプションと同様、-link コンパイラ オプションでは、使用頻度の高い .NET Framework アセンブリを参照する Csc.rsp 応答ファイルを使用します。Like the -reference compiler option, the -link compiler option uses the Csc.rsp response file, which references frequently used .NET Framework assemblies. コンパイラで Csc.rsp ファイルを使用しない場合は、-noconfig コンパイラ オプションを使用してください。Use the -noconfig compiler option if you do not want the compiler to use the Csc.rsp file.

-link の省略形は -l です。The short form of -link is -l.

ジェネリック型と埋め込み型Generics and Embedded Types

以降のセクションでは、相互運用機能型を埋め込むアプリケーションでジェネリック型を使用する際の制限事項について説明します。The following sections describe the limitations on using generic types in applications that embed interop types.

ジェネリック インターフェイスGeneric Interfaces

相互運用アセンブリから埋め込まれるジェネリック インターフェイスを使用することはできません。Generic interfaces that are embedded from an interop assembly cannot be used. これを次の例に示します。This is shown in the following example.

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

ジェネリック パラメーターを含む型Types That Have Generic Parameters

型が相互運用アセンブリから埋め込まれているジェネリック パラメーターを含む型は、外部アセンブリからの型である場合に使用できません。Types that have a generic parameter whose type is embedded from an interop assembly cannot be used if that type is from an external assembly. この制限はインターフェイスには当てはまりません。This restriction does not apply to interfaces. たとえば、Microsoft.Office.Interop.Excel アセンブリで定義されている Range インターフェイスについて考えます。For example, consider the Range interface that is defined in the Microsoft.Office.Interop.Excel assembly. ライブラリによって Microsoft.Office.Interop.Excel アセンブリから相互運用型が埋め込まれ、型が Range インターフェイスであるパラメーターを含むジェネリック型を返すメソッドが公開される場合、次のコード例に示すように、そのメソッドはジェネリック インターフェイスを返す必要があります。If a library embeds interop types from the Microsoft.Office.Interop.Excel assembly and exposes a method that returns a generic type that has a parameter whose type is the Range interface, that method must return a generic interface, as shown in the following code example.

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

次の例では、クライアント コードで、IList ジェネリック インターフェイスを返すメソッドをエラーなしで呼び出すことができます。In the following example, client code can call the method that returns the IList generic interface without error.

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


次のコードは、ソース ファイル OfficeApp.cs と、COMData1.dll および COMData2.dll からの参照アセンブリをコンパイルして、OfficeApp.exe を生成します。The following code compiles source file OfficeApp.cs and reference assemblies from COMData1.dll and COMData2.dll to produce OfficeApp.exe.

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

関連項目See also