方法 : CodeModel オブジェクトを使用して C# クラスを作成する
更新 : 2007 年 11 月
CodeModel2 オブジェクト階層には、コードを自動的に生成するための一連のメソッドが含まれています。コードを手動で入力するのが一般的ですが、このプロセスの一部を自動化すると便利なケースもあります。自動化することで次の利点があります。
名前付け規則が強制的に使用されます。
ドキュメント標準が強制的に使用されます。
標準化されたプロジェクトが作成できます。
この手順は、アドイン プロジェクトの作成方法を理解していることを前提としています。詳細については、「アドインおよびウィザードの作成」を参照してください。
次のプロシージャのクラスは、新しいソース ファイルに含まれます。メソッドは後でクラスに追加されます。
メモ : |
---|
使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。ここに記載されている手順は、全般的な開発設定が適用されているものとして記述されています。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。 |
プロジェクトに新しいソース ファイルを追加するには
Visual C# を使用して、Visual Studio アドイン プロジェクトを作成します。
[プロジェクト] メニューの [参照の追加] をクリックし、[.NET] タブをクリックします。[VSLangProj]、[VSLangProj2]、および [VSLangProj80] を選択し、[OK] をクリックします。
次のメソッド呼び出しを OnConnection メソッドに追加します。
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; // Call the AddClass method. AddAClass(_applicationObject); }
AddAClass メソッドを OnConnection メソッドの直後に追加します。
public void AddAClass(DTE2 dte) { }
AddAClass メソッドに次のコードを追加して、プロジェクトに新しい空のコード ファイルを追加します。
CodeFile テンプレートは、Visual Studio と一緒にインストールされているため、GetProjectItemTemplate メソッドを使用して指定できます。メソッドは、2 つのパラメータを受け取ります。1 つは検索対象の言語テンプレート、もう 1 つは検索結果のプロジェクト項目のファイル名です。プロジェクト項目は、AddFromTemplate メソッドを使用して作成されます。
この例を実行する前に、proj = soln.Projects.Item(1); というコードのために、Visual Studio 統合開発環境 (IDE: Integrated Development Environment) で Visual C# ソリューションを開いておく必要があります。
Project proj; String csItemTemplatePath; Solution2 soln; soln = (Solution2)_applicationObject.Solution; // Open a C# solution in the Visual Studio IDE // before running this add-in. proj = soln.Projects.Item(1); ProjectItem pi; csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp"); proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile.cs"); pi = proj.ProjectItems.Item("MyFile.cs");
ソース ファイルに名前空間を追加するには
ソース ファイルに名前空間を追加するには次のコードを追加します。
FileCodeModel プロパティには、ファイル内のすべてのコード要素を表す FileCodeModel2 オブジェクトへの参照が含まれています。FileCodeModel2 オブジェクトには、コード要素をソース ファイルに追加するためのメソッドがいくつか用意されています。AddNamespace メソッドは CodeNamespace オブジェクトを返します。クラス定義をソース コードに追加するには、この CodeNamespace 参照を使用します。
FileCodeModel2 fcm = (FileCodeModel2)pi.FileCodeModel; CodeNamespace games;
クラスを名前空間に追加するには
AddClass メソッドを使用し、 Games 名前空間に Chess クラスを追加します。AddClass メソッドは、CodeClass インスタンスへの参照を返します。このインスタンスを使用して、プロパティおよびメソッドをクラスに追加できます。
games = fcm.AddNamespace("Games", -1); CodeClass2 chess;
メソッドを定義するには
AddFunction メソッドを使用し、Chess クラスに Move メソッドを追加します。このメソッドの 1 番目の引数で、作成した関数の名前を指定します。演算子およびコンストラクタも AddFunction メソッドを使用して追加されるため、2 番目の引数で、作成した関数の型を決定します。3 番目の引数は、関数の戻り値の型を指定し、メソッドのシグネチャとしてそのまま置き換えられます。
if (games != null) { // Add a class to the namespace. chess = (CodeClass2)games.AddClass("Chess", -1, null, null, vsCMAccess.vsCMAccessDefault); // Add a method with a parameter to the class. CodeFunction2 move; move = (CodeFunction2)chess.AddFunction("Move", vsCMFunction.vsCMFunctionFunction, "int", -1, vsCMAccess.vsCMAccessDefault, null); move.AddParameter("IsOK", "bool", -1); }
これらのプロシージャによって作成されたソース ファイルを次に示します。
namespace Games { class Chess { int Move(bool IsOK) { return default(int); } } }
アドインのコードを次に示します。
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; // Call the AddClass method. AddAClass(_applicationObject); } public void AddAClass(DTE2 dte) { Project proj; String csItemTemplatePath; Solution2 soln; soln = (Solution2)_applicationObject.Solution; // Open a C# solution in the Visual Studio IDE // before running this add-in. proj = soln.Projects.Item(1); ProjectItem pi; csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp"); proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile.cs"); pi = proj.ProjectItems.Item("MyFile.cs"); FileCodeModel2 fcm = (FileCodeModel2)pi.FileCodeModel; CodeNamespace games; try { // Add a namespace. games = fcm.AddNamespace("Games", -1); CodeClass2 chess; if (games != null) { // Add a class to the namespace. chess = (CodeClass2)games.AddClass("Chess", -1, null, null, vsCMAccess.vsCMAccessDefault); // Add a method with a parameter to the class. CodeFunction2 move; move = (CodeFunction2)chess.AddFunction("Move", vsCMFunction.vsCMFunctionFunction, "int", -1, vsCMAccess.vsCMAccessDefault, null); move.AddParameter("IsOK", "bool", -1); } } catch (Exception ex) { MessageBox.Show("Failed to add a code model element, because " + ex.Message); } }
Public Sub OnConnection(ByVal application As Object, _ ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, _ ByRef custom As Array) Implements IDTExtensibility2.OnConnection _applicationObject = CType(application, DTE2) _addInInstance = CType(addInInst, AddIn) AddAClass(_applicationObject) End Sub Public Sub AddAClass(ByVal dte As DTE2) Dim proj As Project Dim csItemTemplatePath As String Dim soln As Solution2 soln = CType(_applicationObject.Solution, Solution2) ' Open a C# solution in the Visual Studio IDE before ' running this add-in. proj = soln.Projects.Item(1) Dim pi As ProjectItem csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp") proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile34.cs") pi = proj.ProjectItems.Item("MyFile34.cs") Dim fcm As FileCodeModel2 = CType(pi.FileCodeModel, FileCodeModel2) Dim games As CodeNamespace Try ' Add a namespace. games = fcm.AddNamespace("Games") Dim chess As CodeClass2 If Not games Is Nothing Then ' Add a class to the namespace. chess = CType(games.AddClass("Chess"), CodeClass2) ' Add a method with a parameter to the class. Dim move As CodeFunction2 move = CType(chess.AddFunction("Move", vsCMFunction.vsCMFunctionFunction, _ "int"), CodeFunction2) move.AddParameter("IsOK", "bool") End If Catch e As Exception MsgBox("Failed to add a code model element, because " & _ e.ToString()) End Try End Sub
OnConnection クラスのコードを上記のプログラム例で置き換えます。この例の実行方法の詳細については、「方法 : アドイン マネージャを使用してアドインを制御する」を参照してください。
参照
処理手順
方法 : CodeModel オブジェクトを使用して Visual Basic コードを分析する
概念
Visual Basic アプリケーションおよび C# アプリケーションの CodeModel オブジェクトの概要