/link (C# コンパイラ オプション)
指定のアセンブリ内の COM 型情報をコンパイル中のプロジェクトで使用できるようにします。
/link:fileList
// -or-
/l:fileList
引数
- fileList
必ず指定します。アセンブリのファイル名をコンマで区切ったリストです。ファイル名に空白が含まれる場合は、二重引用符 (" ") で囲む必要があります。
解説
/link オプションを使用すると、埋め込み型情報を含むアプリケーションを配置できます。このアプリケーションは、ランタイム アセンブリを参照せずに、埋め込み型情報を実装するランタイム アセンブリ内の型を使用できます。ランタイム アセンブリのバージョンが多数公開されている場合、埋め込み型情報を含むアプリケーションは、再コンパイルしなくても各種バージョンと共に使用できます。例については、「チュートリアル: マネージ アセンブリからの型の埋め込み (C# および Visual Basic)」を参照してください。
/link オプションは、COM 相互運用機能を使用している場合に特に便利です。COM 型を埋め込むと、ターゲット コンピューターにプライマリ相互運用機能アセンブリ (PIA: Primary Interop Assembly) がなくてもアプリケーションを実行できるようになります。/link オプションを使用すると、コンパイラによって、COM 型情報が参照先の相互運用機能アセンブリから結果としてコンパイルされるコードに埋め込まれます。COM 型は、CLSID (GUID) 値によって識別されます。そのため、同じ CLSID 値を持つ同じ COM 型がインストールされているターゲット コンピューターでアプリケーションを実行できます。たとえば、Microsoft Office を自動化するアプリケーションの例を考えてみます。通常、Office のようなアプリケーションは異なるバージョン間で同じ CLSID 値を保持するので、.NET Framework 4 以降がターゲット コンピューターにインストールされていて参照先の COM 型に含まれるメソッド、プロパティ、またはイベントが作成アプリケーションで使用される限りは、そのアプリケーションで参照先の COM 型を使用できます。
/link オプションで埋め込まれるのは、インターフェイス、構造体、およびデリゲートだけです。COM クラスの埋め込みはサポートされていません。
[!メモ]
コードで埋め込み COM 型のインスタンスを作成する場合は、適切なインターフェイスを使用してインスタンスを作成する必要があります。コクラスを使用して埋め込み COM 型のインスタンスを作成しようとすると、エラーが発生します。
Visual Studio で /link オプションを設定するには、アセンブリ参照を追加して、Embed Interop Types プロパティを true に設定します。Embed Interop Types プロパティの既定値は false です。
別の COM アセンブリ (アセンブリ B) を参照する COM アセンブリ (アセンブリ A) にリンクする場合、次のいずれかの条件に該当するときは、アセンブリ B にもリンクする必要があります。
アセンブリ A の型がアセンブリ B の型を継承しているか、アセンブリ B のインターフェイスを実装している場合。
アセンブリ B の戻り値の型やパラメーターの型を持つフィールド、プロパティ、イベント、またはメソッドを呼び出す場合。
/reference コンパイラ オプションと同様に、/link コンパイラ オプションでは、頻繁に使用される .NET Framework アセンブリを参照する Csc.rsp 応答ファイルが使用されます。コンパイラで Csc.rsp ファイルを使用しない場合は、/noconfig コンパイラ オプションを使用します。
/link の省略形は /l です。
ジェネリックと埋め込み型
以下のセクションでは、相互運用型を埋め込むアプリケーションでジェネリック型を使用する場合の制限事項について説明します。
ジェネリック インターフェイス
相互運用機能アセンブリから埋め込まれたジェネリック インターフェイスは使用できません。これを次の例に示します。
// The following code causes an error if ISampleInterface is an embedded interop type.
ISampleInterface<SampleType> sample;
ジェネリック パラメーターを含む型
型が相互運用機能アセンブリから埋め込まれたジェネリック パラメーターを含む型は、その型が外部アセンブリからの型である場合は使用できません。ただし、これはインターフェイスには当てはまりません。たとえば、Microsoft.Office.Interop.Excel アセンブリで定義されている Range インターフェイスについて考えてみます。ライブラリによって Microsoft.Office.Interop.Excel アセンブリから相互運用型が埋め込まれ、型が Range インターフェイスであるパラメーターを含むジェネリック型を返すメソッドが公開される場合は、次のコード例に示すように、そのメソッドがジェネリック インターフェイスを返す必要があります。
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 ジェネリック インターフェイスを返すメソッドをエラーなしで呼び出すことができます。
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 を生成する場合のコード例です。
csc /link:COMData1.dll,COMData2.dll /out:OfficeApp.exe OfficeApp.cs
参照
処理手順
チュートリアル: マネージ アセンブリからの型の埋め込み (C# および Visual Basic)