我想创建一个在Visual Studio项目中生成代码的AfterBuild任务。问题是因为它是AfterBuild任务,所以生成的代码不会被编译。
我需要它作为AfterBuild任务,因为我加载构建的输出程序集并使用反射检查它以生成代码。
有没有办法可以在AfterBuild任务之后编译生成的代码?
感谢。
答案 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"/>