防止将引用的程序集PDB和XML文件复制到输出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了防止将引用的程序集PDB和XML文件复制到输出相关的知识,希望对你有一定的参考价值。

我有一个Visual Studio 2008 C#/ .NET 3.5项目,其中包含一个后期构建任务来压缩内容。但是我发现我还在输出目录(和ZIP)中获取引用的程序集'.pdb(debug)和.xml(文档)文件。

例如,如果MyProject.csproj引用YourAssembly.dll,并且在与DLL相同的目录中存在YourAssembly.xml和YourAssembly.pdb文件,它们将显示在我的输出目录(和ZIP)中。

我可以在ZIP'ing时排除* .pdb但我不能排除* .xml文件,因为我有相同扩展名的部署文件。

有没有办法阻止项目复制引用的程序集PDB和XML文件?

答案

您也可以通过命令行指定:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none
另一答案

我希望能够在我的主应用程序中添加和删除引用的程序集,同时避免需要维护我需要删除或排除的文件。

我挖了Microsoft.Common.targets寻找可行的东西,找到了AllowedReferenceRelatedFileExtensions财产。它默认为.pdb; .xml所以我在我的项目文件中明确定义了它。问题是你需要一些东西(空白是不够的),否则它仍将使用默认值。

<Project ...>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
    <AllowedReferenceRelatedFileExtensions>
      <!-- Prevent default XML and PDB files copied to output in RELEASE. 
           Only *.allowedextension files will be included, which doesn't exist in my case.
       -->
      .allowedextension
    </AllowedReferenceRelatedFileExtensions> 
  </PropertyGroup>
另一答案

您可以添加类似于del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"的Post Build事件命令

另一答案

这是一个相当古老的问题,但由于没有关于如何通过UI关闭生成PDB和XML文件的答案,我认为它应该在这里是为了完整性。

在Visual Studio 2013中:在项目属性中的“编译”选项卡下,取消选中“生成XML文档文件”,然后单击下面的“高级编译选项”并将“生成调试信息”更改为“无”,这样就可以了。

另一答案

我的答案现在可能很简单,但我想分享我用来删除xml文件的BAT脚本,如果有相应的dll的话。如果您只想清理输出文件夹并且有其他不想删除的xml文件,这将非常有用。

SETLOCAL EnableDelayedExpansion

SET targetDir=%1

ECHO Deleting unnecessary XML files for dlls

FOR %%F IN (%targetDir%*.xml) DO (

  SET xmlPath=%%~fF
  SET dllPath=!xmlPath:.xml=.dll!

  IF EXIST "!dllPath!" (
    ECHO Deleting "!xmlPath!"
    DEL "!xmlPath!"
  )
)

用法:

Cleanup.bat c:my-output-folder

我花了一个小时才完成这个简单的工作(感谢“延迟扩展”的东西)以及所有类型的搜索。希望它能帮助像我这样的其他BAT新手。

另一答案

我没有太多运气与其他答案,我终于弄明白如何在我的实现中使用内置的"Delete" command,显然有一个特定的方式,你需要implement wildcards,它是bit nuanced,这里是你需要的一切放入“CSPROJ”(TargetDir是一个内置变量,自动包含在“Project”标签下:

<Target Name="RemoveFilesAfterBuild">   
    <ItemGroup>
        <XMLFilesToDelete Include="$(TargetDir)*.xml"/>
        <PDBFilesToDelete Include="$(TargetDir)*.pdb"/>
    </ItemGroup>
    <Delete Files="@(XMLFilesToDelete)" />
    <Delete Files="@(PDBFilesToDelete)" />
</Target>

我也遇到了生成各种语言特定文件夹的问题,如果你也有这个问题,你也可以删除未使用的语言特定文件夹。我选择只在构建类型“Release”下触发它:

<ItemGroup>
    <FluentValidationExcludedCultures Include="be;cs;cs-CZ;da;de;es;fa;fi;fr;ja;it;ko;mk;nl;pl;pt;ru;sv;tr;uk;zh-CN;zh-CHS;zh-CHT">
        <InProject>false</InProject>
    </FluentValidationExcludedCultures> 
</ItemGroup>

<Target Name="RemoveTranslationsAfterBuild" AfterTargets="AfterBuild" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <RemoveDir Directories="@(FluentValidationExcludedCultures->'$(OutputPath)%(Filename)')" />

    <ItemGroup>
        <XMLFilesToDelete Include="$(TargetDir)*.xml"/>
        <PDBFilesToDelete Include="$(TargetDir)*.pdb"/>
    </ItemGroup>
    <Delete Files="@(XMLFilesToDelete)" />
    <Delete Files="@(PDBFilesToDelete)" />
</Target>
另一答案

如果您不需要它们,为什么要生成.pdb.xml文件呢?您可以在项目的属性→构建(→高级...)中禁用调试符号和文档文件生成。 (可能仅适用于Release构建。)

另一答案

如果您只想排除XML文件(例如调试版),您可以执行以下操作:

<AllowedReferenceRelatedFileExtensions>
  <!-- Prevent default XML from debug release  -->
      *.xml
 </AllowedReferenceRelatedFileExtensions>

基本上,列出的每个扩展名(以分号分隔)将被排除在外。

以上是关于防止将引用的程序集PDB和XML文件复制到输出的主要内容,如果未能解决你的问题,请参考以下文章

如何防止引用程序集的嵌入式依赖项被复制到Visual Studio中的输出文件夹?

如何不将 app.config 文件复制到输出目录

csproj中引用的程序集不会复制到输出目录

在发布时强制将外部文件复制到 bin 文件夹

编译后的dll,xml,pdb分别是什么内容,各有什么用处?

编译后的dll,xml,pdb分别是什么内容,各有什么用处?