How can I add a new file to .csproj file without v

2019-06-15 06:01发布

How can I add a new file to .csproj from command prompt?

4条回答
够拽才男人
2楼-- · 2019-06-15 06:27

Here's an easy way you can do it using Linq2Xml. I've included a single and a list based method. Oh, and like Casper said: you'll need to unload the project from VS before your program can edit it. Then just reload it when done.

    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; 
}
  • Updated with AddProjectContent method
查看更多
SAY GOODBYE
3楼-- · 2019-06-15 06:36

.csproj files can be used as input into the MSBuild command line tool.

See the MSBuild reference:

MS Build Reference

And for example, this question.

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

You can simply use a text editor to edit them and do anything MSBuild allows. If you insert custom build actions Visual Studio might warn a developer when the project is loaded that it contains custom actions, depending on what you do.

查看更多
Animai°情兽
4楼-- · 2019-06-15 06:42

Unload the project by right clicking it in solution explorer. Edit the project by right clicking. Add f.ex:

<Compile Include="Properties\AssemblyInfo.cs" />
查看更多
The star\"
5楼-- · 2019-06-15 06:50

I don't think there's any tool that will respond to an "add-project" command on the command-line to do this, but I think you could have luck creating a program/script to manipulate the XML content of csproj files directly.

The structure of a csproj file looks like this:

<?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>

To add a C# code file to a project, you just need to add a Compile element to an ItemGroup element:

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

If you use an existing project file as a template, this should be possible with a very simple XSLT.

查看更多
登录 后发表回答