使用 snk 密钥签名时构建错误

11

自从使用Visual Studio 2015以来,出现了构建错误。在Visual Studio 2015中进行构建很少发生,但在TeamCity中构建经常发生。

[Visual Studio 2015 中的错误]

  • 从文件“CompanyName.snk”提取公钥时出错:另一个进程正在使用文件'C:\Users\UserName\AppData\Local\Temp\tmp2FF6.tmp'。 CompanyName.Project.DAL D:\Projecten\CompanyName\Repository\Source\Components\CompanyName.Project.DAL\vbc

http://i.stack.imgur.com/hKbbe.png

[TeamCity 中的错误]

  • CSC 错误 CS7027: 使用来自文件“CompanyName.snk”的公钥签名输出时出错--另一个进程正在使用文件'C:\BuildAgents\Gamma\temp\buildTmp\tmpD91D.tmp'。

http://i.stack.imgur.com/rbgHx.png


1
看起来是多核构建的问题。您尝试过使用单个MSBuild实例(不带/m开关)构建解决方案吗?您尝试过诊断MSBuild的详细输出日志吗?您尝试过确定哪个进程拥有临时文件吗? - stukselbax
我最近一周在我们的Jenkins构建服务器上开始看到这个问题!我在构建时使用4个核心(/m:4)。它似乎是随机发生的,并且每次都会出现不同的项目。我从未在本地遇到过这个错误,只有在构建服务器上才会出现。 - llykke
我们的构建服务器突然出现了这个问题,后来发现是Windows Defender最近更新(2020年7月)导致的,详见我的评论此处 - Paul
8个回答

13

我知道这个问题已经有一段时间了,但我将SO用作自己的参考,并且我也遇到了这个问题,所以我想分享我的解决方案。

.snk文件用于为项目签名。您可能需要创建一个新的文件。

  • 右键单击您的项目,选择属性。
  • 点击签名。
  • 勾选“对程序集进行签名”的复选框。
  • 在下拉列表“选择强名称密钥文件”中单击“新建”。
  • 按您的意愿填写对话框,特别注意密钥文件名。当您单击“确定”时,将生成一个新的.snk文件。
  • 保存项目并重新构建。
  • 这将在您的项目中使用新的.snk文件,并解决错误。

希望这能帮到你。


1
现在我会尝试一下,暂时只是移除了项目上的签名。同时也找到了一个解决方法 :-) - Bart VdA

4
尝试清理编译使用的临时文件夹。当临时文件夹有大量文件时,我看到了不同类型的问题。
一些工具正在使用GetTempFileName,当临时文件夹有很多文件时,它们会出现错误。
如果使用GetTempFileName方法创建超过65535个文件而没有删除先前的临时文件,则会引发IOException异常。

代理程序的临时文件夹中的文件数量是有限制的。您所指的是这个临时文件夹吗? - Bart VdA
就是这个问题。运行构建的用户的临时文件夹(C:\Users\USERNAME\AppData\Local\Temp)中包含超过65535个文件。 - Alex M

2
这可能是Roslyn编译器的此问题的一个实例。解决方法是添加


<UseSharedCompilation>False</UseSharedCompilation>

在.csproj文件的任何<PropertyGroup>节点下。

0
我在msbuild参数中使用了'/m:1',并在csproj文件中将'SignPublic'属性设置为true。

0

对我来说,这个问题是在我将Resharper缓存移动到系统临时文件夹后开始的。当我将它移回解决方案文件夹时,问题消失了,我又可以进行构建了。


0

我刚遇到了同样的问题。在Visual Studio 2015中,我使用以下步骤解决了它:

  1. 转到“工具 > 选项”
  2. 从“选项”对话框中选择“项目和解决方案 > 构建和运行”
  3. 将“最大并行项目生成数”设置为1

+1 给 @stukselbax 帮我找到正确的解决方法 这个链接也帮了我很多忙


0
今天在Visual Studio 2022中遇到了这个问题- 我正在处理csproj文件,结果发现snk文件的路径错误。我通过更改路径来进行修复。
  1. 右键单击项目 -> 卸载(以便您可以编辑csproj文件)

  2. <PropertyGroup>下检查<AssemblyOriginatorKeyFile>标签

  3. 我的代码如下:<SignAssembly>true</SignAssembly> <AssemblyOriginatorKeyFile>../NAMEHERE.snk</AssemblyOriginatorKeyFile> NAMEHERE是特定于我的项目的,您的将有所不同。查看您的snk文件。前面的 ../ 会有所不同,请检查snk文件的路径。如果您像我一样通过调整csproj文件导致此错误,则正确答案是更改之前的路径。 :)

  4. 右键单击项目 -> 重新加载


0
双击打开您的项目并将其设置为false。
  <SignAssembly>false</SignAssembly> 
 <PublicSign>false</PublicSign>

删除这行:
 <AssemblyOriginatorKeyFile>CompanyName.snkk</AssemblyOriginatorKeyFile>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接