Visual Studio AfterBuild任务生成代码

时间:2015-03-29 01:16:26

标签: c# visual-studio msbuild

我想创建一个在Visual Studio项目中生成代码的AfterBuild任务。问题是因为它是AfterBuild任务,所以生成的代码不会被编译。

我需要它作为AfterBuild任务,因为我加载构建的输出程序集并使用反射检查它以生成代码。

有没有办法可以在AfterBuild任务之后编译生成的代码?

感谢。

2 个答案:

答案 0 :(得分:1)

可以使用CSharpCodeProvider类在运行时编译C#代码,请查看此article,这是很好的解释。虽然听起来好像你想通过注入你在AfterBuild任务事件中编译的代码来改变(例如编织)你的库。

如果是这种情况,实现您想要做的唯一方法是使用AOP(面向方面​​编程)框架,如PostSharp或Mono.Cecil。他们所做的是生成IL(中间语言)并在运行时或编译时注入您的程序。

在此answer中讨论了一些针对.NET的AOP解决方案。

编辑:

要以编程方式编译c#project(* .csproj),.NET框架中有特定的类。查看Microsoft.Build.Evaluation命名空间。

但是这段代码应该对你有用。在你的任务中尝试它,你应该能够从你的代码中启动另一个编译过程。

      const string projectPath = @"your csproj path";
      var collection = new Microsoft.Build.Evaluation.ProjectCollection {DefaultToolsVersion = "4.0"};


      collection.RegisterLogger(new ConsoleLogger());
      collection.LoadProject(projectPath);

      var project = new Microsoft.Build.Evaluation.Project(collection);

      if (!project.Build())
      {
         //Error
      }
希望它有所帮助。

答案 1 :(得分:1)

CSC就是这样做的。在我的vcproj中,我包括:

  <Target Name="AfterBuild">
        <MyGenerateCodeTask />
        <CSC
              Sources="@(Compile)"
              References="@(Reference)"
              AdditionalLibPaths="$(OutputPath)"
              OutputAssembly="$(TargetName)$(TargetExt)"
              EmitDebugInformation="true" >
        </CSC>
  </Target>

要确保CSC找到所有必需的引用,请添加以下内容:

<Reference Include="$(OutputPath)*.dll"/>