次の方法で共有


入力を指定する C# コンパイラ オプション

次のオプションは、コンパイラの入力を制御します。 新しい MSBuild 構文は太字で示されています。 以前の csc.exe 構文は、code style で示されています。

  • 参照 / -referenceまたは -references: 指定したアセンブリ ファイルまたはファイルのメタデータを参照します。
  • AddModules / -addmodule: モジュールを追加します (このアセンブリに target:module で作成されます)。
  • EmbedInteropTypes / -link: 指定した相互運用機能アセンブリ ファイルからメタデータを埋め込みます。

リファレンス

[参照] オプションを指定すると、コンパイラは指定したファイル内のパブリック型情報を現在のプロジェクトにインポートし、指定したアセンブリ ファイルからメタデータを参照できるようにします。

<Reference Include="filename" />

filename は、アセンブリ マニフェストを含むファイルの名前です。 複数のファイルをインポートするには、ファイルごとに個別の Reference 要素を含めます。 Reference 要素の子要素としてエイリアスを定義できます。

<Reference Include="filename.dll">
  <Aliases>LS</Aliases>
</Reference>

前の例では、 LS は、アセンブリ filename.dll内のすべての名前空間を含むルート名前空間を表す有効な C# 識別子です。 インポートするファイルにはマニフェストが含まれている必要があります。 AdditionalLibPaths を使用して、1 つ以上のアセンブリ参照が配置されているディレクトリを指定します。 AdditionalLibPaths トピックでは、コンパイラがアセンブリを検索するディレクトリについても説明します。 コンパイラがモジュールではなくアセンブリ内の型を認識するには、型を強制的に解決する必要があります。これは、型のインスタンスを定義することで実行できます。 コンパイラのアセンブリ内の型名を解決する方法は他にもあります。たとえば、アセンブリ内の型から継承した場合、型名はコンパイラによって認識されます。 場合によっては、1 つのアセンブリ内から同じコンポーネントの 2 つの異なるバージョンを参照する必要があります。 これを行うには、各ファイルの References 要素の Aliases 要素を使用して、2 つのファイルを区別します。 この別名は、コンポーネント名の修飾子として使用され、いずれかのファイル内のコンポーネントに解決されます。

Visual Studio で、[参照の 追加] コマンドを使用します。 詳細については、「 方法: 参照マネージャーを使用して参照を追加または削除する」を参照してください

AddModules

このオプションは、 <TargetType>module</TargetType> スイッチを使用して作成されたモジュールを現在のコンパイルに追加します。

<AddModule Include=file1 />
<AddModule Include=file2 />

ここで filefile2 はメタデータを含む出力ファイルです。 ファイルにアセンブリ マニフェストを含めることはできません。 複数のファイルをインポートするには、コンマまたはセミコロンでファイル名を区切ります。 AddModules で追加されるすべてのモジュールは、実行時に出力ファイルと同じディレクトリに存在する必要があります。 つまり、コンパイル時に任意のディレクトリにモジュールを指定できますが、モジュールは実行時にアプリケーション ディレクトリに存在する必要があります。 実行時にモジュールがアプリケーション ディレクトリにない場合は、 TypeLoadExceptionが表示されます。 file アセンブリを含めることはできません。 たとえば、出力ファイルがモジュールTargetType オプションを使用して作成された場合、そのメタデータを AddModules でインポートできます。

出力ファイルがモジュール以外の TargetType オプションを使用して作成された場合、そのメタデータは AddModules ではインポートできませんが、[参照] オプションを使用してインポートできます。

EmbedInteropTypes

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

<References>
  <EmbedInteropTypes>file1;file2;file3</EmbedInteropTypes>
</References>

ここで file1;file2;file3 は、アセンブリ ファイル名のセミコロン区切りのリストです。 ファイル名にスペースが含まれている場合は、名前を引用符で囲みます。 EmbedInteropTypes オプションを使用すると、埋め込み型情報を持つアプリケーションをデプロイできます。 アプリケーションでは、ランタイム アセンブリへの参照を必要とせずに、埋め込み型情報を実装するランタイム アセンブリで型を使用できます。 ランタイム アセンブリのさまざまなバージョンが発行されている場合、埋め込み型情報を含むアプリケーションは、再コンパイルしなくてもさまざまなバージョンで動作できます。 例については、「 チュートリアル: マネージド アセンブリからの型の埋め込み」を参照してください。

EmbedInteropTypes オプションの使用は、COM 相互運用機能を使用する場合に特に便利です。 アプリケーションでターゲット コンピューターにプライマリ相互運用機能アセンブリ (PIA) が不要になるように、COM 型を埋め込むことができます。 EmbedInteropTypes オプションは、参照先の相互運用機能アセンブリの COM 型情報を結果のコンパイル済みコードに埋め込むようコンパイラに指示します。 COM 型は CLSID (GUID) 値によって識別されます。 その結果、同じ CLSID 値を持つ同じ COM 型をインストールしたターゲット コンピューターでアプリケーションを実行できます。 Microsoft Office を自動化するアプリケーションは良い例です。 Office などのアプリケーションは通常、異なるバージョン間で同じ CLSID 値を保持するため、.NET Framework 4 以降がターゲット コンピューターにインストールされていて、参照先の COM 型に含まれるメソッド、プロパティ、またはイベントを使用している限り、アプリケーションは参照先の COM 型を使用できます。 EmbedInteropTypes オプションは、インターフェイス、構造体、およびデリゲートのみを埋め込みます。 COM クラスの埋め込みはサポートされていません。

コードに埋め込まれた COM 型のインスタンスを作成するときは、適切なインターフェイスを使用してインスタンスを作成する必要があります。 CoClass を使用して埋め込み COM 型のインスタンスを作成しようとすると、エラーが発生します。

References コンパイラ オプションと同様に、EmbedInteropTypes コンパイラ オプションでは Csc.rsp 応答ファイルが使用されます。このファイルは、頻繁に使用される .NET アセンブリを参照します。 コンパイラで Csc.rsp ファイルを使用しない場合は、 NoConfig コンパイラ オプションを使用します。

// 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()
    {
        return null;
    }

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

次の例では、クライアント コードは、エラーなしで 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();
    }
}