用VS201SP1解决C++/CLI汇编签名问题的解决方案

你好,我叫Amit Mohindra,我是MS Visual C++团队的项目经理。

null

最近,我们意识到SP1的更改,它影响了程序集(C++/CLI程序集)的签名过程,作为以下论坛帖子的一部分:

http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/4b8f353d-8153-45d6-b286-10403cdf159a?prof=required

SP1中的问题将影响使用链接器上的开关对程序集进行签名(作为其生成的一部分)的用户。要对程序集进行签名,必须显式设置this属性,方法是右键单击项目以打开“属性”对话框,然后在“配置属性”->“链接器”->“高级”下设置“密钥文件”属性以使用签名密钥。默认情况下,此属性为空,因此如果没有显式设置它,则不受影响。

如果您正在使用CLI项目中的链接器开关对最终程序集进行签名,请按照本博客的内容进行解锁。

我们对大会签字问题给您带来的不便深表歉意。我们认识到,SP1中的这个更改引入了一个无意中断的更改。这确实是VS2010 SP1中的一个bug。

我先给大家介绍一下 问题出现在VS2010 RTM中 ,我们的 SP1的改变破坏了你的项目 最后是 你可以申请的变通办法 去打开你们自己。

背景

  1. VS2010 RTM
    1. 使用C++项目构建的程序集根本没有签名。
      1. 这是因为mt.exe会使前一个链接步骤(对二进制文件进行签名)执行的签名无效。这是预期的行为。
      2. 若要阻止生成过程运行的无效性,请执行“其他” LinkedManifest公司 “在mt.exe嵌入清单后重新签名程序集的步骤。
      3. 但是,在VS2010 RTM中,跳过了步骤1.a.B。因此,大会没有得到签署。
    2. 所以我们推荐了一个解决方案来运行“ sn.exe–R文件< 装配 > < 密钥文件 > “(例如。 sn-R debugCLRConsole.exe C:mykey.snk )  作为自定义生成步骤的一部分,并对程序集进行签名。
  2. VS2010 SP1 (修复使你崩溃的问题)
    1. 主要原因是 LinkedManifest公司 “在VS2010 RTM中跳过的步骤是,在构建过程中,触发此步骤的决策逻辑没有足够的信息。决策逻辑需要“的评估值” 密钥文件 “和” 延迟标志 “(链接器上的属性)。这些值存储为“ 项目定义组 ”  (项目文件中的IDG)和IDG在决策点之后进行评估,因此不可用。
    2. 来解决我们提出的问题” 密钥文件 “和” 延迟标志 “MSBuild属性”( <属性组> )相反,由于MSBuild属性在早期进行了评估,我们现在可以决定是否运行“ LinkedManifest公司 “不管你走不走。有了这个变更,我们就不需要定制构建步骤了(如上面1.a.B中所建议的)
    3. 作为SP1自述的一部分( http://go.microsoft.com/fwlink/?LinkId=210711 –第2.4.1.2节)我们建议对项目进行重构,以使签名生效。建议是重新定义 密钥文件 “和” 延迟标志 “使用IDE的项目的属性。
    4. 但是,该解决方案有两个问题:
      1. 首先,当您将Win32配置作为构建项目的目标时,我们的构建文件中的一个输入错误会使上述建议不起作用。
      2. 第二,我们没有意识到使用旧方法和VS2010 RTM工作区(在1.a.B中提到)的人会被破坏。

变通办法

下面的解决方法使您能够修复上面在2.d.A和2.d.B中描述的两个问题。你可以用两种方法来解决这个问题。

1.更改解决方案中的每个项目,并重新定义链接器上的“密钥文件”和“延迟签名”属性。为此,请执行以下步骤:

·修复构建过程中的打字错误(2.d.A):

  1. 正常开放 命令 提示为管理员
  2. %%程序文件(x86)%%MSBuildMicrosoft.Cppv4.0PlatformsWin32
  3. “运行” 记事本Microsoft.Cpp.Win32.targets “(x64目标很好)
  4. “找到” LinkedManifest公司 “目标(搜索 )
  5. 在上述目标和任务下” <链接 “执行以下步骤。
  6. 更改属性 延迟符号
    1. 发件人: 延迟符号  =”%%(链接延迟符号“
    2. 收件人: 延迟符号  =”$(“延迟符号”
  7. 更改属性 密钥文件
    1. 发件人: 密钥文件    =”%%(Link.KeyFile)“
    2. 收件人: 密钥文件    =”$(LinkKeyFile)“

·“重新定义” 密钥文件 “和” 延迟标志 “用于签署项目的属性(2.d.B):

  1. 右键单击项目以打开属性页。
  2. 转到配置 属性->链接器->高级
  3. “覆盖属性” 密钥文件 “使用原始密钥文件(例如。 我的文件.snk )
  4. 此解决方案消除了自定义构建步骤的需要(如VS2010RTM-1.2背景部分所述)
  5. 如果要在VS2010 RTM和VS2010 SP1中使用相同的项目,请确保重新定义这些属性时,它们与VS2010 RTM中设置的原始值相匹配。

2. 或者 ,如果您有很多项目并且不想执行步骤1(如上),或者可以进行以下更改以恢复VS2010 RTM行为:

  1. 正常开放 命令 提示为管理员
  2. 转到“ %%程序文件(x86)%%MSBuildMicrosoft.Cppv4.0PlatformsWin32
  3. “运行” 记事本Microsoft.Cpp.Win32.targets
  4. 移动到“ 链接 “目标(搜索 )
  5. 在第一行后面加上以下几行  “ “定义  在“战争”之前 <链接 “任务 %%(Link.DelaySign) %%(Link.KeyFile)
  6. “找到” LinkedManifest公司 “目标(搜索 )
  7. 在上述目标和任务下” <链接 “执行以下步骤。
  8. 更改属性 延迟符号
    1. 发件人: 延迟符号   =”%%(链接延迟符号“
    2. 收件人: 延迟符号   =”$(“延迟符号”
  9. 更改属性 密钥文件
    1. 发件人: 密钥文件     =”%%(Link.KeyFile)“
    2. 收件人: 密钥文件     =”$(LinkKeyFile)“
  10. 对“1”重复步骤1至5 %%程序文件(x86)%%MSBuildMicrosoft.Cppv4.0Platformsx64
  11. 请注意,此解决方案会将您移回VS2010 RTM行为,并且您仍然需要使用原始的解决方法在自定义生成步骤中使用sn.exe对程序集进行签名。

感谢您帮助我们提高产品质量。我们知道这一变化给您带来了很大的痛苦,对此我们深表歉意。同时,我们也在寻找其他途径,为您提供此修复。

谢谢, 阿米特

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享