在Visual Studio 2015中无法签署C++/CLI程序集

7

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

Signing a C++/CLI assembly

签名始终失败,并出现以下错误:LNK1346 ALINK操作失败(80040436):错误签署程序集 - 由于另一个进程正在使用该文件,因此无法访问该文件。 同一程序集在Visual Studio 2013中可以签名(我今天刚升级了它)。
这是2015年已知的问题吗(当我搜索该错误时找不到任何错误)?还是我做错了什么?
编辑:解决方法
似乎这又是McAfee AV的另一个错误。但是,有另一种签署文件的方法,可能会给McVirus足够的时间释放它所占用的锁。
程序集可以延迟签名,并且可以运行sn-R $(TargetPath)$(LinkKeyFile)作为后期构建事件以完成签名。这对我和@Moop有效。

看起来有人已经处理了这个文件。我会假设是Visual Studio中的另一个工具。开始的最佳方式是确定“谁”拥有这个句柄。尝试使用procexp.exe查看是否有其他进程打开了您要签名的文件的句柄。 - linuxuser27
你的解决方法有效,将其制作成答案可能会有用。此外,$(LinkKeyFile) 宏似乎可以工作:sn -R $(TargetPath) $(LinkKeyFile)。 - Moop
@Moop - 谢谢,我更新了问题并强调了解决方法。 - satnhak
感谢这个出色的解决方案!这个问题让我疯狂了几个月,因为链接器时而失败,然后又工作了几个小时,再次失败,我找不到原因。我们使用不同的病毒扫描程序,但我想其他扫描程序也可能会导致同样的问题。 - Doc Brown
1个回答

6

由于另一个进程正在使用该文件,因此该进程无法访问该文件。

在我的机器上完全正常,这不是VS2015的问题。这是一个常见的环境问题,在被恶意软件感染的Windows机器上,这个错误消息是标准悲剧。

签名是一个两步过程。首先,link.exe必须生成可执行文件,以便可以为文件计算SHA256哈希值。然后,ALINK(托管链接器)重新打开文件以添加签名。它必须与其他运行在您的计算机上对文件感兴趣的进程进行斗争。当一个可执行文件从似乎出现的地方出现并坚持检查文件内容并排除对文件的访问直到完成时,它总是会把内裤缠在一起。

当您使用延迟签名时,它似乎完全正常,延迟通常足以使进程完成其工作并释放对文件的独占锁定。此外,有些可能性sn.exe更加复杂,定期重试打开文件,然后放弃,而ALINK则不是。

您必须在防恶意软件产品中进行构建目录的排除。如果它是像Avast、AVG或ESET这样的激进免费软件,则计划尽快摆脱它,以便它再也不会打扰您。Defender从未给我带来任何麻烦。


谢谢,听起来是对的。我们的机器上安装了麦咕病毒(Afee),它会干扰很多东西。我稍后会在我的笔记本电脑上尝试使用适当的进程终止程序进行确认。让我困惑的是为什么它在2013年可以正常工作,但在2015年却不能?link.exe和ALINK有重大变化吗? - satnhak
您永远无法获得诊断,例如某个单字节的更改现在与病毒签名匹配,这使得扫描程序查找得更加彻底。 - Hans Passant
有没有办法监视文件上的锁定?Procexp 对于短时间内被占用的锁并不起作用,因此无法看到是什么锁定了文件,而资源监视器可能会对整个系统进行快照,这意味着它不能提供足够准确的图片。 - satnhak
据我所知,锁定通常不会持续足够长的时间,以便利用工具来诊断恶意行为。显而易见的方法是遵循我的建议,如果问题消失,则可以坚定地保证这是反恶意软件产品。 - Hans Passant
希望你知道这个问题并不是仅限于微软的Defender吗?从技术上讲,无论是第三方的安全软件还是Defender都不再是独立的产品了,但是对于这个问题,我们可以将Defender与其他软件放在一起。它会引起相同的问题并破坏构建过程(不仅仅是上述问题,还包括PDB文件的创建或DLL文件的链接等)。我写这个是因为我理解你的回答暗示第三方安全软件受到这个问题的困扰,但微软自己的解决方案不会。可能我误解了你的意思。 - undefined

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