在预构建事件中添加源文件和程序集引用

3
我希望在我的项目中有一个"manifest.json"文件,其中包含项目依赖的.cs和.dll文件列表,但这些文件不是项目的一部分。为了在构建过程中编译这些文件,我需要告诉Visual Studio将这些源文件和程序集包含到构建过程中。
是否可以在预构建事件中完成此操作?

为什么不把那些文件放到另一个项目中呢? - giammin
@giammin 因为依赖于另一个项目意味着依赖于它们生成的汇编代码。我想直接依赖于源文件,这些源文件会被编译成我的可执行文件。 - Van Coding
1
为什么不把那些文件包含在项目中? - giammin
@giammin 这不是动态的。更好地解释一下:清单文件也可以引用另一个引用其他源文件和程序集的清单文件。我的最终项目的清单文件将引用当前项目的所有源文件,所有需要的程序集以及项目依赖的所有清单文件(这些文件再次执行相同的操作)。我希望你能理解我想做什么的想法... - Van Coding
2个回答

2
我已经制作了一个自定义的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) 创建一个名为“AddSourceFiles.targets”的*.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>

我对此也非常新,所以请随意改进 ;)


1

我在哪里可以下载宏IDE?微软网站不想让我知道 :/ ..没有使用C#的可能性吗? - Van Coding
我也讨厌vb。当我需要创建宏时,我会在c#中创建一个dll,然后用vb调用它。要打开宏IDE,请从visualstudio按Alt + F11。如果你想避免使用宏,也许visual studio automation model可以满足你的需求。 - giammin
我已经找到了使用自定义ITaskItem的方法,但我仍然对使用宏或Visual Studio自动化解决方案感兴趣。您能否提供一个非常基本的示例来说明如何实现? - Van Coding
@VanCoding 这个问题的解决方案有一个宏,你可以很容易地根据自己的需求进行调整:https://dev59.com/j0vSa4cB1Zd3GeqPbx4_ - giammin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接