【问题标题】:Visual studio AfterBuild Task that generates code生成代码的 Visual Studio AfterBuild 任务
【发布时间】:2015-04-02 11:23:19
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 我通过添加 解决了这个问题
  • 如果你愿意,我可以在我的答案中添加这个案例,以供其他用户将来参考
  • 好点。我删除了编辑并将其添加为答案。您的方法不同但仍然有用,因此最好将其保留在那里(“原样”)。谢谢。

标签: c# visual-studio msbuild


【解决方案1】:

可以在运行时使用CSharpCodeProvider 类编译C# 代码,看看这个article,解释得很好。尽管听起来您想通过注入您在 AfterBuild 任务事件中编译的代码来更改(例如编织)您的库。

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

在这个answer 中讨论了一些 .NET 的 AOP 解决方案。

编辑:

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

但是这个 sn-p 应该适合你。在您的任务中尝试它,您应该能够从您的代码中触发另一个编译过程。

      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
      }

希望对你有帮助。

【讨论】:

  • 对于我想要实现的目标来说,这听起来有点矫枉过正。我只是希望构建能够拾取我生成的类。我的任务已经是编译过程的一部分,那就太好了如果我可以在生成代码后以某种方式重新触发构建。
  • 谢谢乔瓦尼。这不会导致循环构建吗?
  • 如果是同一个项目,是的。你可能会在你的 afterbuild 任务中引入一个只运行一次的检查
【解决方案2】:

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"/>

【讨论】:

  • 我试图在构建后向我的项目注入一些代码,我遇到了这个问题。我想知道是否有办法与您联系,因为您似乎正在尝试做同样的事情。你有什么博客或什么可以联系到你的吗?
  • @Dryadwoods 我最终使用了一个 BeforeBuild 任务并在构建之前生成代码。好处是代码作为构建的一部分自动构建。看看我的 github repo (github.com/Microsoft/SimpleStubs/blob/master/Documentation/…),我在其中描述了这个过程。该代码也可用。
  • 谢谢,我去看看:)
猜你喜欢
  • 2012-02-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多