【问题标题】:How can I add a new file to .csproj file without visual studio如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件
【发布时间】:2013-01-17 15:56:28
【问题描述】:

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

【问题讨论】:

  • 您可以使用文本编辑器编辑 .csproj。
  • 你为什么要做这样的事情?目标是什么?
  • 这是一个真实的问题,我不同意它应该被关闭。
  • 我想生成类(遵循某种模式)并将这些类附加到几个 .csprojs
  • @AlexanderBeninski,看看 T4 模板以生成您的代码。

标签: c# .net visual-studio


【解决方案1】:

我认为没有任何工具可以响应命令行上的“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。

【讨论】:

    【解决方案2】:

    这是一个使用 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 方法更新

    【讨论】:

    • 能否请您提供 AddProjectContent 的代码,因为您的回答应该可以解决我的问题..
    • 当然没问题。来吧: 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"));返回xelem; }
    【解决方案3】:

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

    请参阅 MSBuild 参考:

    MS Build Reference

    例如,这个问题。

    MSBuild — Use the .csproj file or roll your own?

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

    【讨论】:

      【解决方案4】:

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

      <Compile Include="Properties\AssemblyInfo.cs" />
      

      【讨论】:

      • 我想知道投反对票的原因,因为这是对所提问题的有效答案。
      • 我没有投反对票,但问题明确表示“没有视觉工作室”。您的回答不符合该标准。
      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多