次の方法で共有


-link (Visual Basic)

指定したアセンブリ内の COM 型情報を、現在のコンパイル対象のプロジェクトで使用できるようにします。

構文

-link:fileList  

or

-l:fileList  

引数

期間 定義
fileList 必須です。 アセンブリ ファイル名のコンマ区切りリスト。 ファイル名に空白が含まれている場合は、名前を二重引用符で囲みます。

Remarks

-link オプションを使用すると、埋め込み型情報を含むアプリケーションを配置できます。 その後、このアプリケーションは、埋め込み型情報を実装する、ランタイム アセンブリ内の型を使用できます。その際、ランタイム アセンブリへの参照は必要ありません。 ランタイム アセンブリのさまざまなバージョンが公開されている場合、埋め込み型情報を含むアプリケーションは、再コンパイルする必要なく、各種バージョンで動作できます。 例については、「チュートリアル:マネージド アセンブリからの型の埋め込み」をご覧ください。

-link オプションの使用は、COM 相互運用を使用している場合に特に便利です。 COM 型を埋め込むことができるため、アプリケーションは、ターゲット コンピューター上にプライマリ相互運用機能アセンブリ (PIA) を必要としなくなります。 -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 の戻り値の型またはパラメーターの型を使用するフィールド、プロパティ、イベント、またはメソッドが呼び出される。

1 つまたは複数のアセンブリ参照が配置されているディレクトリを指定するには、-libpath を使用します。

-reference コンパイラ オプションと同様、-link コンパイラ オプションでは、使用頻度の高い .NET Framework アセンブリを参照する Vbc.rsp 応答ファイルを使用します。 コンパイラで Vbc.rsp ファイルを使用しない場合は、-noconfig コンパイラ オプションを使用します。

-link の省略形は -l です。

ジェネリック型と埋め込み型

以降のセクションでは、相互運用機能型を埋め込むアプリケーションでジェネリック型を使用する際の制限事項について説明します。

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

相互運用アセンブリから埋め込まれるジェネリック インターフェイスを使用することはできません。 これを次の例に示します。

' The following code causes an error if ISampleInterface is an embedded interop type.
Dim sample As ISampleInterface(Of SampleType)

ジェネリック パラメーターを含む型

型が相互運用アセンブリから埋め込まれているジェネリック パラメーターを含む型は、外部アセンブリからの型である場合に使用できません。 この制限はインターフェイスには当てはまりません。 たとえば、Microsoft.Office.Interop.Excel アセンブリで定義されている Range インターフェイスについて考えます。 ライブラリによって Microsoft.Office.Interop.Excel アセンブリから相互運用型が埋め込まれ、型が Range インターフェイスであるパラメーターを含むジェネリック型を返すメソッドが公開される場合、次のコード例に示すように、そのメソッドはジェネリック インターフェイスを返す必要があります。

Imports System.Collections.Generic
Imports Microsoft.Office.Interop.Excel

Class Utility
    ' The following code causes an error when called by a client assembly.
    Public Function GetRange1() As List(Of Range)
End Function

' The following code is valid for calls from a client assembly.
Public Function GetRange2() As IList(Of Range)
    End Function
End Class

次の例では、クライアント コードで、IList ジェネリック インターフェイスを返すメソッドをエラーなしで呼び出すことができます。

Module Client
    Public Sub Main()
        Dim util As New Utility()

        ' The following code causes an error.
        Dim rangeList1 As List(Of Range) = util.GetRange1()

        ' The following code is valid.
        Dim rangeList2 As List(Of Range) = CType(util.GetRange2(), List(Of Range))
    End Sub
End Module

次のコマンド ラインでは、ソース ファイル OfficeApp.vb と、COMData1.dll および COMData2.dll からの参照アセンブリをコンパイルして、OfficeApp.exe を生成します。

vbc -link:COMData1.dll,COMData2.dll -out:OfficeApp.exe OfficeApp.vb  

関連項目