【问题标题】:Add source files and assembly references on pre build event在预构建事件中添加源文件和程序集引用
【发布时间】:2013-02-06 13:58:10
【问题描述】:

我想在我的项目中有一个“manifest.json”文件,其中包含项目所依赖但不属于项目的 .cs 和 .dll 文件的列表。要在构建时也编译这些文件,我需要以某种方式告诉 Visual Studio 将这些源文件和程序集包含到构建过程中。

有没有办法在预构建活动中做到这一点?

【问题讨论】:

  • 你为什么不把这些文件放在另一个项目中。
  • @giammin 因为依赖于另一个项目意味着依赖于他们生成的程序集。我想直接依赖源文件,这些文件被编译到我的可执行文件中。
  • 为什么不在项目中包含这些文件?
  • @giammin 这不是动态的。为了更好地解释它:一个清单文件还可以引用另一个清单文件,该文件引用其他源文件和程序集。我的最终项目的清单文件将引用当前项目的所有源文件、所有需要的程序集和项目所依赖的所有清单文件(它们再次执行相同的操作)。我希望你明白我想做什么......

标签: c# visual-studio pre-build-event


【解决方案1】:

我现在制作了一个自定义 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>

我对此也很陌生,所以请随时改进这个;)

【讨论】:

    【解决方案2】:

    您应该使用 VisualStudio 宏:

    http://msdn.microsoft.com/en-us/library/b4c73967(v=vs.100).aspx

    http://msdn.microsoft.com/en-us/library/8h31zbch.aspx

    Macros IDE 包含一个与您想要实现的目标类似的示例:

    AddDirAsSlnFolder — 将磁盘上的文件夹导入解决方案文件夹结构。

    -----更新-----

    我刚刚发现 Vs2012 删除了宏功能....

    【讨论】:

    • 在哪里可以下载宏 IDE? Microsoft 网站不想让我知道:/ .. 有没有可能使用 C# 来做到这一点?
    • 我也讨厌vb。当我必须创建一个宏时,我在 c# 中创建一个 dll,然后用 vb 调用它。从 visualstudio 打开 Macros IDE Alt+F11。如果您想避免使用宏,也许 Visual Studio 自动化模型可以满足您的需求。
    • 我找到了一种使用自定义 ITaskItem 的方法,但我仍然对使用宏或 Visual Studio 自动化的解决方案感兴趣。您能否提供一个非常基本的示例来说明如何做到这一点?
    • @VanCoding 这个问题的解决方案有一个宏,您可以轻松适应您的需求:stackoverflow.com/questions/2000197/…
    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2011-06-01
    • 2013-01-21
    相关资源
    最近更新 更多