关于C ++ CLI:无法在Visual Studio 2015中签名C ++ / CLI程序集

 2020-05-24 

Cannot sign C++/CLI assembly in Visual Studio 2015

使用Visual Studio 2015和2015工具集:当我尝试直接对程序集进行如下签名时:

Signing a C++/CLI assembly

签名始终失败,并出现以下错误:
LNK1346 ALINK operation failed (80040436) : Error signing assembly -- The process cannot access the file because it is being used by another process.

可以在Visual Studio 2013中对同一程序集进行签名(我今天刚刚对其进行了升级)。

这是2015年的已知问题吗(当我搜索该错误时找不到任何错误)? 还是我做错了什么?

编辑:解决方法

看来这是另一个McAfee AV错误。 但是,还有另一种方法来对文件进行签名,这可能会使McVirus有足够的时间来释放已取出的锁。

可以对程序集进行延迟签名,并且sn -R $(TargetPath) $(LinkKeyFile)可以作为构建后事件运行以完成签名。 这对我和@Moop都有效。


The process cannot access the file because it is being used by another process.

在我的机器上工作正常,这不是VS2015问题。常见的环境问题,此错误消息是感染了压缩包恶意软件的Windows计算机上的标准悲剧。

签名是一个两步过程。首先,link.exe必须生成可执行文件,因此可以为该文件计算SHA256哈希。然后,文件由ALINK(托管链接器)重新打开以添加签名。它也必须与对文件感兴趣的计算机上运行的其他进程做斗争。当可执行文件看似无处出现时,这种类型总是束手无策,并坚持检查文件内容并排除对文件的访问,直到完成为止。

使用延迟签名时,它似乎工作得很好,延迟通常足以使进程完成其工作并释放文件上的排他锁。 sn.exe稍微复杂一点,在放弃之前重试定期打开文件,但ALINK当然不是。

您必须在构建目录的反恶意软件产品中进行排除。如果它是诸如Avast,AVG或ESET之类的激进免费软件,则计划尽快删除它,以使其永远不会再打扰您。防御者永远不会给我带来任何麻烦。