c#を使用してVS2005でプロジェクトをプログラム的または動的に作成することは可能ですか?もしそうなら、誰かがこれを達成する方法についていくつかのアイデアやリンクを提供できますか?
7 に答える
msbuild api を使用して、プログラムで msbuild ファイルを作成および編集することもできます。詳細については、http: //msdn.microsoft.com/en-us/library/microsoft.build.buildengine.project.aspxを参照してください。
単一の .cs ファイルをコンパイルし、外部アセンブリを参照するプロジェクトを作成する例を次に示します。
Engine engine=new Engine();
engine.BinPath=RuntimeEnvironment.GetRuntimeDirectory();
Project project=engine.CreateNewProject();
project.AddNewImport(@"$(MSBuildBinPath)\Microsoft.CSharp.targets", null);
BuildPropertyGroup props=project.AddNewPropertyGroup(false);
props.AddNewProperty("AssemblyName", "myassembly");
props.AddNewProperty("OutputType", "Library");
BuildItemGroup items=project.AddNewItemGroup();
items.AddNewItem("Reference", "Some.Assembly");
items.AddNewItem("Compile", "somefile.cs");
project.Save("myproject.csproj")
.csproj ファイルは、実際には msbuild の実行を表す XML ドキュメントです。
ファイルは System.xml を使用して生成できます。それを検証する必要がある場合は、ここに詳細なスキーマがあります。
同じものを何度も作成できるようにしたい場合は、VisualStudioがテンプレートをサポートしています。テンプレートからファイルを作成するときに展開するマクロもあります。たとえば、$ username $は、テンプレートに基づくファイルが作成されたときに、ログインしているユーザーの名前に置き換えられます。
それが目的ではない場合は、VisualStudioの拡張性を使用してプロジェクトの作成を制御しようとしている可能性があります。
この CodePlex プロジェクトのソース コードを見てみましょう: STSDev
最終的に、プロジェクトを使用して Visual Studio ソリューションを動的に生成する WinForm アプリになります。
これはSharepoint向けですが、それが使用するアイデアはあなたが探しているものです.
キース
Visual Studio プロジェクト テンプレートを作成して、その中に子プロジェクトを作成できます。プロジェクトの作成中にどの子プロジェクト テンプレートを実行するかを定義するため、これは実際には動的ではありません。
本当に動的にするには、次のいずれかを行う必要があります。
- csproj/vbproj ファイルとそこに必要なすべての項目をプログラムで作成します。これには、XML の設定参照などが含まれます。
または:
- プロジェクト テンプレートを作成し、VS プロジェクト作成メカニズムに接続して create project メソッドを呼び出します。これに関するドキュメントが 0 つも見つからず、MS ASP.NET MVC プロジェクト作成ウィザード DLL からリバース エンジニアリングを行う方法を学んでいたため (ユニット テスト プロジェクトが動的に作成されるため)、これは非常にトリッキーになる可能性があります。
Visual Studio プロジェクトは、"単なる" XML ファイルです。私が言うのは、彼らの中で多くのことが起こっているからです。それらが何で構成されているかを理解するには: 空のプロジェクトを作成し、csproj (C#.NET プロジェクト) または vsproj (VB.NET プロジェクト) をテキスト エディターで開きます。
その後、コードを使用してこの XML ファイルを生成できます。
Visual Studio 2017 の場合、envdte に基づくソリューションを見つけました。xml 操作は必要ありません。ビジュアル スタジオ ide を使用します。ここでプロジェクトを見つけることができますNager.TemplateBuilder