2010-03-30 54 views
4

我们有一个生成一些代码(的.cs),用于建设该项目文件的工具。强制文件刷新之前建立

编辑:这些文件都是一些局部类的另一半,所以在生成过程需要访问源。例如,无法将其编译到DLL中,然后设置构建顺序。

该工具在预生成步骤运行,但是文件仅在生成后的溶液,这意味着构建需要进行两次改变到输入后清除错误更新。

例子:

  • 修改工具输入文件
  • 运行构建
    • 工具运行并更改源文件
  • 构建失败
  • 运行构建
    • 工具运行和变化的源文件(但它不实际上改变,因为输入保持不变)
  • 生成成功

任何想法,我们如何能与双构建做了,而且还让我们的工具从VS运行?

谢谢你们!

+1

我有同样的问题,太多,但我们的工具不会更改往往足以让我试图修复它:) – 2010-03-30 04:30:19

+0

我也有同样的问题。我将我的预生成事件移到构建顺序的早期项目的构建后事件中,并且工作正常。 – AndrewS 2013-10-17 01:03:50

回答

0

的答案竟然是“使用Cake”和PowerShell

1

重构你的SOLN到2个项目:第一代的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(); 
     }}} 
+0

我们不能这样做,因为生成的代码是分部类的一部分。 – 2010-03-30 23:37:57

3

这将是微不足道写一个VS宏,将执行你的工具,然后开始构建,所以你能整个过程只需一次按键即可完成,而且可以快速完成双重构建。

或者(或与上述相结合),你可以自定义的工具来执行您的工具(见工具 - >外部工具)的VS工具菜单中添加。然后在执行构建之前手动执行此自定义工具 - 这仍然是一个乏味的双重步骤,但比构建两次更快更简单。 (并且您可能会让您的工具在预构建步骤中运行,因此旧的双重构建方法仍然可以运行)。

另一个选项可能是编辑您的项目的MSBuild脚本,以便在构建过程的早期执行您的工具,以便在依赖性扫描期间获取对该文件的更改(因此只需要一个构建过程)。

这些都不是很好的解决方案,但希望它们能够为您提供一个可以接受的改进方案,并且可以帮助您改善目前的状况。