ワークスペースの使用

ワークスペース レイヤーは、ソリューション全体でのコード分析とリファクタリングの開始点となります。 このレイヤー内のワークスペース API では、単一のオブジェクト モデルにソリューションのプロジェクトに関するすべての情報を簡単にまとめることができ、ソース テキスト、構文ツリー、セマンティック モデル、コンパイルのようなコンパイラ レイヤー オブジェクト モデルに直接アクセスできます。ファイルの解析、オプションの構成、プロジェクト相互の依存性の管理は必要はありません。

IDE のようなホスト環境では、開いているソリューションに応じてワークスペースが提供されます。 単にソリューション ファイルを読み込んで、IDE の外部でこのモデルを使用することもできます。

ワークスペース

ワークスペースは、ソリューションをプロジェクトのコレクションとしてアクティブに表現するものです。プロジェクトにはそれぞれドキュメントのコレクションが含まれます。 通常、ワークスペースは、ユーザーがプロパティを入力または操作するときに常に変化するホスト環境に関連付けられます。

Workspace では、ソリューションの現在のモデルにアクセスできます。 ホスト環境が変わった場合、ワークスペースは対応するイベントを発生させ、Workspace.CurrentSolution プロパティが更新されます。 たとえば、ソース ドキュメントのいずれかに対応するテキスト エディターにユーザーが入力した場合、ワークスペースでは、ソリューションのモデル全体が変更され、どのドキュメントが変更されたかを通知するイベントを使用します。 したがって、新しいモデルを分析して正しいかどうかを確認したり、重要な領域を強調表示したり、あるいはコードの変更を提案することで、これらの変更に対応できます。

ホスト環境から切断されているか、ホスト環境がないアプリケーションで使用されるスタンドアロンのワークスペースを作成することもできます。

ソリューション、プロジェクト、およびドキュメント

キーが押されるたびにワークスペースが変更されることがありますが、ソリューションのモデルを単独で操作することができます。

ソリューションはプロジェクトとドキュメントの不変モデルです。 つまり、モデルはロックしたり複製したりしなくても共有することができます。 Workspace.CurrentSolution プロパティからソリューション インスタンスを取得した後、そのインスタンスが変わることはありません。 ただし、構文ツリーやコンパイルの場合と同じように、既存のソリューションと特定の変更に基づいて新しいインスタンスを構築することで、ソリューションを変更できます。 ワークスペースで変更を反映するには、変更されたソリューションをワークスペースに明示的に適用し直す必要があります。

プロジェクトは、不変ソリューション モデル全体の一部です。 ソース コード ドキュメント、解析とコンパイル オプション、アセンブリとプロジェクト間の両方の参照をすべて表します。 プロジェクトから対応するコンパイルにアクセスできます。プロジェクトの依存関係を判別したり、ソース ファイルを解析する必要はありません。

ドキュメントも不変ソリューション モデル全体の一部です。 ドキュメントは単一のソース ファイルを表すものであり、そこからファイルのテキスト、構文ツリー、セマンティック モデルにアクセスできます。

次の図は、ワークスペースとホスト環境やツールとの関係、および編集がどのように行われるかを示しています。

the relationships between different elements of a workspace containing projects and source files

まとめ

Roslyn では一連のコンパイラ API とワークスペース API が公開されます。これらの API は、ソース コードに関する豊富な情報を提供し、C# および Visual Basic 言語を完全に再現します。 .NET Compiler Platform SDK は、コードにフォーカスされたツールとアプリケーションの作成における参入障壁を劇的に低くします。 これにより、メタプログラミング、コードの生成と変換、C# と Visual Basic 言語の対話型の使用、ドメイン固有の言語での C# と Visual Basic の埋め込みなどの領域で、多くのイノベーションの機会が生み出されます。