Reputation: 817
How can I add a new file to .csproj
from command prompt?
Upvotes: 16
Views: 14422
Reputation: 2732
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;
}
Upvotes: 1
Reputation: 39685
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.
Upvotes: 5
Reputation: 7951
.csproj files can be used as input into the MSBuild command line tool.
See the MSBuild 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.
Upvotes: 0
Reputation: 2566
Unload the project by right clicking it in solution explorer. Edit the project by right clicking. Add f.ex:
<Compile Include="Properties\AssemblyInfo.cs" />
Upvotes: -1