你好,我叫Amit Mohindra,我是MS Visual C++团队的项目经理。
最近,我们意识到SP1的更改,它影响了程序集(C++/CLI程序集)的签名过程,作为以下论坛帖子的一部分:
SP1中的问题将影响使用链接器上的开关对程序集进行签名(作为其生成的一部分)的用户。要对程序集进行签名,必须显式设置this属性,方法是右键单击项目以打开“属性”对话框,然后在“配置属性”->“链接器”->“高级”下设置“密钥文件”属性以使用签名密钥。默认情况下,此属性为空,因此如果没有显式设置它,则不受影响。
如果您正在使用CLI项目中的链接器开关对最终程序集进行签名,请按照本博客的内容进行解锁。
我们对大会签字问题给您带来的不便深表歉意。我们认识到,SP1中的这个更改引入了一个无意中断的更改。这确实是VS2010 SP1中的一个bug。
我先给大家介绍一下 问题出现在VS2010 RTM中 ,我们的 SP1的改变破坏了你的项目 最后是 你可以申请的变通办法 去打开你们自己。
背景
- VS2010 RTM
- 使用C++项目构建的程序集根本没有签名。
- 这是因为mt.exe会使前一个链接步骤(对二进制文件进行签名)执行的签名无效。这是预期的行为。
- 若要阻止生成过程运行的无效性,请执行“其他” LinkedManifest公司 “在mt.exe嵌入清单后重新签名程序集的步骤。
- 但是,在VS2010 RTM中,跳过了步骤1.a.B。因此,大会没有得到签署。
- 所以我们推荐了一个解决方案来运行“ sn.exe–R文件< 装配 > < 密钥文件 > “(例如。 sn-R debugCLRConsole.exe C:mykey.snk ) 作为自定义生成步骤的一部分,并对程序集进行签名。
- 使用C++项目构建的程序集根本没有签名。
- VS2010 SP1 (修复使你崩溃的问题)
- 主要原因是 LinkedManifest公司 “在VS2010 RTM中跳过的步骤是,在构建过程中,触发此步骤的决策逻辑没有足够的信息。决策逻辑需要“的评估值” 密钥文件 “和” 延迟标志 “(链接器上的属性)。这些值存储为“ 项目定义组 ” (项目文件中的IDG)和IDG在决策点之后进行评估,因此不可用。
- 来解决我们提出的问题” 密钥文件 “和” 延迟标志 “MSBuild属性”( <属性组> )相反,由于MSBuild属性在早期进行了评估,我们现在可以决定是否运行“ LinkedManifest公司 “不管你走不走。有了这个变更,我们就不需要定制构建步骤了(如上面1.a.B中所建议的)
- 作为SP1自述的一部分( http://go.microsoft.com/fwlink/?LinkId=210711 –第2.4.1.2节)我们建议对项目进行重构,以使签名生效。建议是重新定义 密钥文件 “和” 延迟标志 “使用IDE的项目的属性。
- 但是,该解决方案有两个问题:
- 首先,当您将Win32配置作为构建项目的目标时,我们的构建文件中的一个输入错误会使上述建议不起作用。
- 第二,我们没有意识到使用旧方法和VS2010 RTM工作区(在1.a.B中提到)的人会被破坏。
变通办法
下面的解决方法使您能够修复上面在2.d.A和2.d.B中描述的两个问题。你可以用两种方法来解决这个问题。
1.更改解决方案中的每个项目,并重新定义链接器上的“密钥文件”和“延迟签名”属性。为此,请执行以下步骤:
·修复构建过程中的打字错误(2.d.A):
- 正常开放 命令 提示为管理员
- 去 %%程序文件(x86)%%MSBuildMicrosoft.Cppv4.0PlatformsWin32
- “运行” 记事本Microsoft.Cpp.Win32.targets “(x64目标很好)
- “找到” LinkedManifest公司 “目标(搜索
) - 在上述目标和任务下” <链接 “执行以下步骤。
- 更改属性 延迟符号
- 发件人: 延迟符号 =”%%(链接延迟符号“
- 收件人: 延迟符号 =”$(“延迟符号”
- 更改属性 密钥文件
- 发件人: 密钥文件 =”%%(Link.KeyFile)“
- 收件人: 密钥文件 =”$(LinkKeyFile)“
·“重新定义” 密钥文件 “和” 延迟标志 “用于签署项目的属性(2.d.B):
- 右键单击项目以打开属性页。
- 转到配置 属性->链接器->高级
- “覆盖属性” 密钥文件 “使用原始密钥文件(例如。 我的文件.snk )
- 此解决方案消除了自定义构建步骤的需要(如VS2010RTM-1.2背景部分所述)
- 如果要在VS2010 RTM和VS2010 SP1中使用相同的项目,请确保重新定义这些属性时,它们与VS2010 RTM中设置的原始值相匹配。
2. 或者 ,如果您有很多项目并且不想执行步骤1(如上),或者可以进行以下更改以恢复VS2010 RTM行为:
- 正常开放 命令 提示为管理员
- 转到“ %%程序文件(x86)%%MSBuildMicrosoft.Cppv4.0PlatformsWin32 ”
- “运行” 记事本Microsoft.Cpp.Win32.targets ”
- 移动到“ 链接 “目标(搜索
) - 在第一行后面加上以下几行 “
%%(Link.DelaySign) %%(Link.KeyFile) - “找到” LinkedManifest公司 “目标(搜索
) - 在上述目标和任务下” <链接 “执行以下步骤。
- 更改属性 延迟符号
- 发件人: 延迟符号 =”%%(链接延迟符号“
- 收件人: 延迟符号 =”$(“延迟符号”
- 更改属性 密钥文件
- 发件人: 密钥文件 =”%%(Link.KeyFile)“
- 收件人: 密钥文件 =”$(LinkKeyFile)“
- 对“1”重复步骤1至5 %%程序文件(x86)%%MSBuildMicrosoft.Cppv4.0Platformsx64 ”
- 请注意,此解决方案会将您移回VS2010 RTM行为,并且您仍然需要使用原始的解决方法在自定义生成步骤中使用sn.exe对程序集进行签名。
感谢您帮助我们提高产品质量。我们知道这一变化给您带来了很大的痛苦,对此我们深表歉意。同时,我们也在寻找其他途径,为您提供此修复。
谢谢, 阿米特