C#如何自动将所有.cs文件包含在一个文件夹中进行编译?
我有一个项目,其中包含一个T4模板文件,该文件根据另一个项目的输出(dll)生成几个.cs文件,这意味着生成的.cs文件的数量和名称是不同的。现在我想:C#如何自动将所有.cs文件包含在一个文件夹中进行编译?,c#,visual-studio,t4,csproj,C#,Visual Studio,T4,Csproj,我有一个项目,其中包含一个T4模板文件,该文件根据另一个项目的输出(dll)生成几个.cs文件,这意味着生成的.cs文件的数量和名称是不同的。现在我想: 在生成之前,运行T4模板生成.cs文件 在生成中包括在点1上生成的.cs文件 点1由构建前目标存档。对于第2点,我尝试使用通配符包含文件夹中的所有.cs文件,如下所示:,但问题是: 任何新生成的.cs文件都不会包含在第一次生成的输出dll中,而是包含在第二次生成的输出dll中 VS不会刷新项目以显示新生成的.cs文件或删除不存在的.cs文件 当
,但问题是:
<PropertyGroup>
<_CommonProgramFiles>$([System.Environment]::GetEnvironmentVariable('CommonProgramFiles(x86)'))</_CommonProgramFiles>
<_CommonProgramFiles Condition=" '$(_CommonProgramFiles)' == '' ">$(CommonProgramFiles)</_CommonProgramFiles>
<TextTransformPath Condition="'$(TextTransformPath)' == ''">$(_CommonProgramFiles)\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe</TextTransformPath>
<!-- Initial default value -->
<_TransformExe>$(TextTransformPath)</_TransformExe>
<_TransformExe Condition="!Exists('$(_TransformExe)')">$(_CommonProgramFiles)\Microsoft Shared\TextTemplating\10.0\TextTransform.exe</_TransformExe>
<_TransformExe Condition="!Exists('$(_TransformExe)')">$(_CommonProgramFiles)\Microsoft Shared\TextTemplating\11.0\TextTransform.exe</_TransformExe>
<_TransformExe Condition="!Exists('$(_TransformExe)')">$(_CommonProgramFiles)\Microsoft Shared\TextTemplating\12.0\TextTransform.exe</_TransformExe>
<_TransformExe Condition="!Exists('$(_TransformExe)')">$(_CommonProgramFiles)\Microsoft Shared\TextTemplating\13.0\TextTransform.exe</_TransformExe>
<_TransformExe Condition="!Exists('$(_TransformExe)')">$(_CommonProgramFiles)\Microsoft Shared\TextTemplating\14.0\TextTransform.exe</_TransformExe>
</PropertyGroup>
<Target Name="TransformOnBuild" AfterTargets="BeforeBuild">
<Error Text="Failed to find TextTransform.exe tool at '$(_TransformExe)." Condition="!Exists('$(_TransformExe)')"/>
<ItemGroup>
<_TextTransform Include="@(None)" Condition="'%(None.Generator)' == 'TextTemplatingFileGenerator'" />
</ItemGroup>
<!-- Perform task batching for each file -->
<Exec Command=""$(_TransformExe)" "%(_TextTransform.FullPath)""
Condition="'%(_TextTransform.Identity)' != ''"
ContinueOnError="ErrorAndContinue" />
</Target>
$([System.Environment]::GetEnvironmentVariable('CommonProgramFiles(x86)'))
$(通用程序文件)
$(\u CommonProgramFiles)\Microsoft共享\text模板\$(VisualStudioVersion)\TextTransform.exe
$(TextTransformPath)
$(\u CommonProgramFiles)\Microsoft Shared\TextTemplating\10.0\TextTransform.exe
$(\u CommonProgramFiles)\Microsoft Shared\TextTemplating\11.0\TextTransform.exe
$(\u CommonProgramFiles)\Microsoft Shared\TextTemplating\12.0\TextTransform.exe
$(\u CommonProgramFiles)\Microsoft Shared\TextTemplating\13.0\TextTransform.exe
$(\u CommonProgramFiles)\Microsoft Shared\TextTemplating\14.0\TextTransform.exe
是否希望程序集动态地向自身添加源代码?听起来真奇怪。我认为您应该创建一个生成器程序集,其中包含生成源代码的t4模板。然后从创建的源创建您的实际项目。。我认为生成POCO的EntityFramework T4模板使用的是一类一文件一表的方法,这应该与您的情况完全相同-相当不确定数量的.cs文件,每个文件的名称都非常不确定,最终都会添加到项目中并一起构建。您可以查看EF6中的模板,看看它们是如何做到的。我认为它们是开源的,但如果不是,你应该能够从EF6 Nuget或VSIX文件中获取它们。更正:在EF6中,模板作为手动步骤运行,由用户自行决定,以便;这不是自动化的预构建步骤。但是,如果你不关心intellisense,那么它应该是无关紧要的。@Suneet你有一个用于转换的目标的例子吗?您是否正在与某些默认转换目标集成?另外,您使用的是哪个版本的VS?(2017年有一个新的选择加入项目模型,可以更好地处理文件全球化,这对于.net核心项目是有效的)@HimBromBeere我不想向现有程序集添加源代码。这些源代码文件是在“BeforeBuild”目标任务生成程序集之前生成的。问题是,即使这些文件是在生成之前生成的,最终程序集也不包含它们。