C#如何自动将所有.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文件 当

我有一个项目,其中包含一个T4模板文件,该文件根据另一个项目的输出(dll)生成几个.cs文件,这意味着生成的.cs文件的数量和名称是不同的。现在我想:

  • 在生成之前,运行T4模板生成.cs文件
  • 在生成中包括在点1上生成的.cs文件
  • 点1由构建前目标存档。对于第2点,我尝试使用通配符包含文件夹中的所有.cs文件,如下所示:
    ,但问题是:

  • 任何新生成的.cs文件都不会包含在第一次生成的输出dll中,而是包含在第二次生成的输出dll中
  • VS不会刷新项目以显示新生成的.cs文件或删除不存在的.cs文件
  • 当我在VS中的文件夹下删除或添加.cs文件时,VS会将通配符替换为分隔的include命令,如
  • 那么,将所有.cs文件包含在一个文件夹中进行编译以至少解决问题1和3的正确方法是什么呢

    ++在构建目标内容之前

    <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="&quot;$(_TransformExe)&quot; &quot;%(_TextTransform.FullPath)&quot;"
            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”目标任务生成程序集之前生成的。问题是,即使这些文件是在生成之前生成的,最终程序集也不包含它们。