有人知道如何修改 csproj 文件以生成代码文件,而不实际引用这些文件吗?
一个类似于以下过程:
- 创建文件,
- 在构建期间动态引用临时文件
- 编译后的程序集包含额外成员,这取决于构建过程中创建的文件
这样做的目的是使用 Roslyn 创建一种生成代码文件的方式,而不是使用非常麻烦的 T4 模板,一旦您尝试根据属性做某些操作,就会发现 T4 模板很难使用。
因此,我计划提供一种使用特殊的 C# 文件(具有完整的语法支持)来基于该特殊文件的内容以编程方式生成文件的方法。
我已经花了几周时间在互联网上寻找资源(关于 msbuild 的主题),但到目前为止似乎我没有使用正确的关键字。
这篇文章对我来说是最有见地的: https://www.simple-talk.com/dotnet/.net-tools/extending-msbuild/
我的猜测是,为了在构建过程中填充自定义代码文件,对于我的目的来说,正确的构建目标应该是 "BeforeCompile"。
有没有人遇到过我这个问题,或者知道任何处理这个任务的特定资源?
我使用的解决方案:
<UsingTask TaskName="DynamicCodeGenerator.DynamicFileGeneratorTask" AssemblyFile="..\DynamicCodeGenerator\bin\Debug\DynamicCodeGenerator.dll" />
<Target Name="DynamicCodeGeneratorTarget" BeforeTargets="BeforeBuild;BeforeRebuild">
<DynamicFileGeneratorTask>
<Output ItemName="Generated" TaskParameter="GeneratedFilePaths" />
</DynamicFileGeneratorTask>
<ItemGroup>
<Compile Include="@(Generated)" />
<FileWrites Include="@(Generated)" />
<!-- For clean to work properly -->
</ItemGroup>
</Target>
很不幸,我没有像建议的那样使用propertygroup覆盖成功。
更新:这个链接也很有趣:https://github.com/firstfloorsoftware/xcc/blob/master/FirstFloor.Xcc/Targets/Xcc.targets