Visual studio 在生成之前强制重新加载文件
我们有一个工具,可以生成一些用于构建项目的代码(.cs)文件 编辑:这些文件是某些分部类的另一半,因此构建过程需要访问源代码。例如,不可能将其编译成DLL,然后设置构建顺序 该工具在预生成步骤中运行,但仅在生成之后才在解决方案中更新文件,这意味着需要执行两次生成以在更改输入后清除错误 例如:Visual studio 在生成之前强制重新加载文件,visual-studio,visual-studio-2010,Visual Studio,Visual Studio 2010,我们有一个工具,可以生成一些用于构建项目的代码(.cs)文件 编辑:这些文件是某些分部类的另一半,因此构建过程需要访问源代码。例如,不可能将其编译成DLL,然后设置构建顺序 该工具在预生成步骤中运行,但仅在生成之后才在解决方案中更新文件,这意味着需要执行两次生成以在更改输入后清除错误 例如: 修改刀具输入文件 运行构建 工具运行并更改源文件 构建失败 运行构建 该工具运行并更改源文件(但实际上并没有更改,因为输入保持不变) 构建成功 有什么想法我们可以摆脱双重构建,仍然让我们的工具从
- 修改刀具输入文件
- 运行构建
- 工具运行并更改源文件
- 构建失败
- 运行构建
- 该工具运行并更改源文件(但实际上并没有更改,因为输入保持不变)
- 构建成功
谢谢大家 将soln重构为两个项目:第一代是cs文件,第二代使用它(作为dll) 第一个项目(称为Gen)有2个后期生成事件:1)运行工具并重新创建源文件,2)编译Gen’ed src文件以供第二个项目使用:
Gen.exe
csc.exe /target:library Gened.cs
第二个项目(称为Use)引用dll并调用它
==Gen.cs
using System.IO;
namespace sm3
{class Gen
{static string bod = "public static int var = 46;";
static string clas = "public class Gened {" + bod + "}";
static string ns = "namespace sm3 {" + clas + "}";
static void Main(string[] args)
{StreamWriter SW;
SW = File.CreateText("Gened.cs");
SW.WriteLine(ns);
SW.Close();
}}}
==Use.cs
using System;
namespace sm3
{class Use
{static void Main(string[] args)
{Gened g = new Gened();
Console.Write(Gened.var.ToString());
Console.ReadLine();
}}}
编写一个VS宏来执行您的工具,然后启动一个构建,这样您就可以用一次按键来执行整个过程,这一点非常简单,比执行双构建更快 或者(或与上述工具结合使用),您可以将自定义工具添加到执行您的工具的VS工具菜单中(请参见工具->外部工具)。然后在执行构建之前手动执行这个定制工具——这仍然是一个乏味的两步,但是比构建两次要快得多,也容易得多。(并且您可能能够让您的工具在预构建步骤中运行,以便旧的双构建方法仍然有效) 另一个选项可能是编辑项目的MSBuild脚本,以便在生成过程的早期执行工具,以便在依赖项扫描期间拾取对文件的更改(因此只需要一个生成过程)
这些都不是很好的解决方案,但希望它们能为您提供一条线索,使您的当前状况得到可接受的改善。如果有人在寻找,答案是“使用”和Powershell。使用csproj,您可以使用BeforeTargets=“PrepareForBuild”条件:
将在加载要编译的文件之前执行PrepareForBuild目标。有关预定义构建目标的更多详细信息,请参阅。我也遇到过同样的问题,但我们的工具没有经常进行更改,因此我无法尝试修复它:)我也遇到了同样的问题。我在构建顺序的早期将我的预构建事件移动为项目的后构建事件,并且成功了。我们不能这样做,因为生成的代码是分部类的一部分。