我正在尝试生成一个C#代码文件,该文件基于XML文件构造一个对象树。XML中的元素引用正在编译的项目中定义的类型。生成的代码需要构造一个类型的对象树,该对象树在正在编译的项目中找到。为了使事情更复杂,需要将生成的代码编译到正在编译的项目中,并由正在编译的当前项目中的代码引用。
我目前正在尝试使用自定义MSBuild任务来执行此操作。该任务将分发给其他开发人员以在他们自己的项目中使用,因此我无法将可用的类型硬编码到任务中。
这是一些示例代码来说明我在做什么:
// This is not generated
public class SomeClass {
public void DoSomething() {}
public string SomeProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
SomeClass是在项目的未生成代码中定义的Type。这是引用SomeClass并填充SomeProperty属性的XML文件:
... bunch of XML...
<SomeClass SomeProperty="SomeValue" />
... bunch more XML...
Run Code Online (Sandbox Code Playgroud)
SomeOtherClass具有一个未生成的部分声明:
// This is not generated
public partial class SomeOtherClass {
public void SomeMethod() {
someField.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
任务创建部分SomeOtherClass声明:
// This is generated
public partial class SomeOtherClass {
private SomeClass someField = new SomeClass() {
SomeProperty = "SomeValue"
};
}
Run Code Online (Sandbox Code Playgroud)
我认为这看起来很像WPF对XAML文件所做的事情,并且我的用法与之相关(使用XML生成代码,该代码根据正在编译的同一项目中的类型来实例化对象树)。
解决此问题的最佳方法是什么?我应该在任务中进行多阶段编译和使用中间文件吗?我是否应该尝试在Task中单独构建一个临时程序集而不生成代码,然后在临时程序集上进行反射,然后生成代码文件,然后继续正常的构建过程?
这个问题太含糊,无法确定是否有帮助,但希望有帮助。
配置LoadTimeSensitiveTargets和LoadTimeSensitiveProperties以确保IntelliSense甚至在构建项目之前就可以工作。
https://github.com/antlr/antlrcs/blob/9ee43ed9486e55afcc1db06f9f0755658974f99f/AntlrBuildTask/Antlr3.targets#L36-L45
使用AvailableItemName属性可确保用户可以将XML文件的“ 生成操作”设置为您的自定义项目类型。
https://github.com/antlr/antlrcs/blob/9ee43ed9486e55afcc1db06f9f0755658974f99f/AntlrBuildTask/Antlr3.targets#L75-L79
如有必要,请使用ItemDefinitionGroup元素为具有此自定义项目类型的对象定义默认属性,以减少用户为XML文件配置构建所需的工作量。
https://github.com/antlr/antlrcs/blob/9ee43ed9486e55afcc1db06f9f0755658974f99f/AntlrBuildTask/Antlr3.targets#L81-L88
支付非常关注项目添加到收藏喜欢的方式_GeneratedCodeFiles,以确保清洁目标正确清理你的构建。
使用.props文件指定默认配置元素。创建用于分发的NuGet程序包时,.props文件将包含在用户项目的顶部,而.targets将包含在项目的底部。
如果用户输入错误(例如,引用项目中不存在的项目),C#编译器将通知您。通过在代码生成步骤中避免这种分析,可以避免问题中描述的循环依赖性。
ReSharper不支持在构建过程中生成代码的扩展。尽管上述说明多年来一直特别遵循XAML支持建立的模式,但您仍会选择以下选择:
这是在构建过程中生成代码的两个扩展。
ANTLR 3:
https
://github.com/antlr/antlrcs/blob/9ee43ed9486e55afcc1db06f9f0755658974f99f/AntlrBuildTask/Antlr3.props https://github.com/antlr/antlrcs/blob/9ee43ed9486e55afcc1db06f9f0755Task
ANTLR 4:
https
://github.com/tunnelvisionlabs/antlr4cs/blob/9ee43ed9486e55afcc1db06f9f0755658974f99f/runtime/CSharp/Antlr4BuildTasks/Antlr4.v4.0.props https://github.com/tunnelvisionlabs/antlr4cs/blob/99483e CSharp / Antlr4BuildTasks / Antlr4.v4.0.targets