我想在我的项目中有一个“manifest.json”文件,其中包含项目所依赖的 .cs 和 .dll 文件的列表,但不是项目的一部分。要在构建时也编译这些文件,我需要以某种方式告诉 Visual Studio 将这些源文件和程序集包含到构建过程中。
有没有办法在预构建事件中做到这一点?
我想在我的项目中有一个“manifest.json”文件,其中包含项目所依赖的 .cs 和 .dll 文件的列表,但不是项目的一部分。要在构建时也编译这些文件,我需要以某种方式告诉 Visual Studio 将这些源文件和程序集包含到构建过程中。
有没有办法在预构建事件中做到这一点?
我现在制作了一个自定义 ITaskItem,它在构建过程之前添加了文件。
这是我的做法:
1) 创建自定义 ITaskItem
public class AddSourceFiles : Task
{
private ITaskItem[] output = null;
[Output]
public ITaskItem[] Output
{
get
{
return output;
}
}
public override bool Execute()
{
//gather a list of files to add:
List<string> filepaths = new List<string>() { "a.cs", "b.cs", "d.cs" };
//convert the list to a itaskitem array and set it as output
output = new ITaskItem[filepaths.Count];
int pos = 0;
foreach (string filepath in filepaths)
{
output[pos++] = new TaskItem(filepath);
}
}
}
2) 创建一个 *.targets 文件,例如“AddSourceFiles.targets”:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask AssemblyFile="AddSourceFiles.dll" TaskName="AddSourceFiles" />
<PropertyGroup>
<BuildDependsOn>
AddSourceFiles;
$(BuildDependsOn);
</BuildDependsOn>
</PropertyGroup>
<Target Name="AddSourceFiles">
<AddSourceFiles>
<Output TaskParameter="Output" ItemName="Compile" />
</AddSourceFiles>
</Target>
</Project>
如您所见,“AddSourceFiles”类的生成 DLL 在任务文件中被引用。
3) 最后一步是将此 .targets 文件导入您希望使用 AddSourceFiles 类包含文件的每个 .csproj 文件中。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
.
.
<Import Project="c:\path\to\AddSourceFiles.targets" />
.
.
</Project>
我对此也很陌生,所以请随时改进这个;)
你应该使用 VisualStudio 宏:
http://msdn.microsoft.com/en-us/library/b4c73967(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/8h31zbch.aspx
宏 IDE 包含一个与您尝试实现的示例类似的示例:
AddDirAsSlnFolder — 将磁盘上的文件夹导入解决方案文件夹结构。
- - - 更新 - - -
我刚刚发现 Vs2012 删除了宏功能....