Visual studio 生成代码的AfterBuild Task
Visual studio AfterBuild Task that generates code
我想创建一个在 Visual Studio 项目中生成代码的 AfterBuild 任务。问题是因为它是一个 AfterBuild Task,生成的代码不会被编译。
我需要它成为一个 AfterBuild 任务,因为我加载构建的输出程序集并使用反射检查它以生成代码。
有什么方法可以在 AfterBuild Task 之后编译生成的代码?
谢谢。
可以使用 CSharpCodeProvider Class, look at this article 在 运行 时编译 C# 代码,解释得很好。尽管听起来你想通过 注入 你正在 AfterBuild 任务事件中编译的代码来更改(例如编织)你的库。
如果是这种情况,实现您想要做的事情的唯一方法是使用 AOP(面向方面的编程)框架,如 PostSharp 或 Mono.Cecil。他们所做的是生成 IL(中间语言)并在 运行 时或编译时注入到您的程序中。
在此 answer 中讨论了一些 .NET 的 AOP 解决方案。
编辑:
要以编程方式编译 c# 项目 (*.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
}
希望对您有所帮助。
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"/>
我想创建一个在 Visual Studio 项目中生成代码的 AfterBuild 任务。问题是因为它是一个 AfterBuild Task,生成的代码不会被编译。
我需要它成为一个 AfterBuild 任务,因为我加载构建的输出程序集并使用反射检查它以生成代码。
有什么方法可以在 AfterBuild Task 之后编译生成的代码?
谢谢。
可以使用 CSharpCodeProvider Class, look at this article 在 运行 时编译 C# 代码,解释得很好。尽管听起来你想通过 注入 你正在 AfterBuild 任务事件中编译的代码来更改(例如编织)你的库。
如果是这种情况,实现您想要做的事情的唯一方法是使用 AOP(面向方面的编程)框架,如 PostSharp 或 Mono.Cecil。他们所做的是生成 IL(中间语言)并在 运行 时或编译时注入到您的程序中。
在此 answer 中讨论了一些 .NET 的 AOP 解决方案。
编辑:
要以编程方式编译 c# 项目 (*.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
}
希望对您有所帮助。
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"/>