C# 不使用visual studio生成解决方案文件

C# 不使用visual studio生成解决方案文件,c#,winforms,visual-studio,solution,C#,Winforms,Visual Studio,Solution,我正在构建一个程序,该程序生成许多代码文件(cpp、h、hpp文件)。 使用“生成”按钮触发新文件的生成,我想添加另一个功能,我还希望“生成”按钮在生成具有正确设置的文件后生成一个sulotion(对于visual studio),这样用户就不必处理它了。 因此,用户单击“生成”,生成新文件,他也可以在VisualStudio中打开整个项目,并按正确的顺序进行修复 我该怎么做 您可以借鉴自定义Visual Studio项目系统示例,并使用Microsoft.Build.dll程序集的Micros

我正在构建一个程序,该程序生成许多代码文件(cpp、h、hpp文件)。 使用“生成”按钮触发新文件的生成,我想添加另一个功能,我还希望“生成”按钮在生成具有正确设置的文件后生成一个sulotion(对于visual studio),这样用户就不必处理它了。 因此,用户单击“生成”,生成新文件,他也可以在VisualStudio中打开整个项目,并按正确的顺序进行修复


我该怎么做

您可以借鉴自定义Visual Studio项目系统示例,并使用Microsoft.Build.dll程序集的Microsoft.Build.Construction命名空间

MSDN:

Microsoft.Build命名空间包含提供对MSBuild引擎的编程访问和控制的类型

是用于以编程方式向中添加文件和创建解决方案的主类

表示MSBuild项目、目标文件或符合MSBuild项目文件架构的任何其他文件。此类及其相关类允许读取和写入完整的MSBuild项目或目标文件

例如,要启动您的解决方案,您可以:

var project = ProjectRootElement.Create();

project.DefaultTargets = "Build";
project.ToolsVersion = "4.0";
…要添加文件,您可以执行以下操作:

foreach (var unescapedFile in allFiles)
{
    var file = ProjectCollection.Escape(unescapedFile);
    var ext = Path.GetExtension(file);
    var fileType = "Content";   
    folders.Add(Path.GetDirectoryName(file));    
    var item = project.AddItem(fileType, file);
    .
    .
    .
}
…通过以下方式最终确定解决方案:

var imports = project.AddPropertyGroup();
imports.AddProperty("VisualStudioVersion", "10.0")
       .Condition = " '$(VisualStudioVersion)' == '' ";

(customization ?? DefaultProjectCustomization.Instance).Process(
                                                                project,
    new Dictionary<string, ProjectPropertyGroupElement>
    {
        {"Globals", globals},
        {"Imports", imports},
        {"Debug", debugGroup},
        {"Release", releaseGroup}
    }
    );
模板 编辑:在下面的评论中对这一建议表示感谢:)

如果要加载一个“模板”项目文件以用作新项目的基础,您可能需要查看
ProjectRootElement.TryOpen()
。它将返回一个
ProjectRootElement
,您也可以使用该元素修改和/或添加新项目,并将结果保存为新项目

e、 g

告诉我更多
  • 您可以在中看到如何以编程方式生成解决方案文件的完整工作示例

用记事本打开一些解决方案和项目文件。检查它们。试着去理解他们。最终创造你自己@Farhanam逆向工程有时并不明智,在这种情况下也没有必要,微软已经为此提供了API。请参阅下面的答案。如果MSBuild API不这样做,我建议您添加代码,以显示OP如何将某种现有的解决方案文件作为模板加载。我似乎记得,实际的VS解决方案文件往往有一些神秘的,但可能是必要的样板文件。
project.Save(writer);
using (var writer = new StreamWriter("NewProject.csproj", false, Encoding.UTF8))
{
    var project = ProjectRootElement.TryOpen("my template.csproj");
    project.AddItem("Content", "miss piggy.png");
    project.Save(writer);
}