16

如何.csproj从命令提示符添加新文件?

4

4 回答 4

5

我认为没有任何工具可以响应命令行上的“add-project”命令来执行此操作,但我认为您可以创建一个程序/脚本来直接操作 csproj 文件的 XML 内容。

csproj 文件的结构如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="...">
    <PropertyGroup>
        <!-- Properties which affect the build process -->
    </PropertyGroup>
    <ItemGroup>
        <!-- Groups of items to process -->
    </ItemGroup>
</Project>

要将 C# 代码文件添加到项目中,只需将Compile元素添加到ItemGroup元素:

<Compile Include="{relative path to file}" />

如果您使用现有的项目文件作为模板,那么使用非常简单的 XSLT 应该可以做到这一点。

于 2013-01-17T16:10:09.750 回答
1

这是一个使用 Linq2Xml 的简单方法。我已经包含了一个基于列表的方法。哦,就像 Casper 所说的那样:您需要先从 VS 卸载项目,然后您的程序才能对其进行编辑。然后在完成后重新加载它。

    private static void AddFilesToUnitTestProject(FileInfo[] files, string measureBaseDirPath, string measureDataDirSuffix)
    {
        var unitTestProjectPath = measureBaseDirPath + _unitTestProjectFile;
        var unitTestProjectFile = XDocument.Load(unitTestProjectPath);
        var itemGroup = unitTestProjectFile.Nodes()
                          .OfType<XElement>()
                          .DescendantNodes()
                          .OfType<XElement>().First(xy => xy.Name.LocalName == "ItemGroup");

        foreach (var fileInfo in files)
        {
            var xelem = AddProjectContent(measureDataDirSuffix + fileInfo.Name, unitTestProjectFile);
            itemGroup.Add(xelem);
        }
        unitTestProjectFile.Save(unitTestProjectPath);
    }

    private static void AddFileToUnitTestProject(string pathToAdd, string measureBaseDirPath, string measureDataDir)
    {
        var unitTestProjectPath = measureBaseDirPath + _unitTestProjectFile;
        var unitTestProjectFile = XDocument.Load(unitTestProjectPath);
        var itemGroup =
        unitTestProjectFile.Nodes()
                           .OfType<XElement>()
                           .DescendantNodes()
                           .OfType<XElement>().First(xy => xy.Name.LocalName == "ItemGroup");
        var xelem = AddProjectContent(pathToAdd, unitTestProjectFile);
        itemGroup.Add(xelem);
        unitTestProjectFile.Save(unitTestProjectPath);
    }

private static XElement AddProjectContent(string pathToAdd, XDocument doc) 
{ 
    XNamespace rootNamespace = doc.Root.Name.NamespaceName; 
    var xelem = new XElement(rootNamespace + "Content"); 
    xelem.Add(new XAttribute("Include", pathToAdd)); 
    xelem.Add(new XElement(rootNamespace + "CopyToOutputDirectory", "Always")); 
    return xelem; 
}
  • 使用 AddProjectContent 方法更新
于 2013-07-22T20:22:02.790 回答
0

.csproj 文件可用作 MSBuild 命令行工具的输入。

请参阅 MSBuild 参考:

MS 构建参考

例如,这个问题。

MSBuild — 使用 .csproj 文件还是自己创建?

您可以简单地使用文本编辑器来编辑它们并执行 MSBuild 允许的任何操作。如果您插入自定义生成操作,Visual Studio 可能会在加载项目时警告开发人员它包含自定义操作,具体取决于您执行的操作。

于 2013-01-17T16:07:39.593 回答
-1

通过在解决方案资源管理器中右键单击项目来卸载项目。通过右键单击编辑项目。添加 f.ex:

<Compile Include="Properties\AssemblyInfo.cs" />
于 2013-01-17T16:06:20.343 回答