找不到SN.EXE签署大会(Cannot find sn.exe to sign Assembly)

2019-07-21 09:17发布

我看着C:\Program Files\Microsoft.NET ,我看不到任何SN.exe文件。

我安装了.NET 3.5运行时; 这还不够?

Answer 1:

您需要安装Windows SDK 6.0A,而不仅仅是运行。

如果您已经安装了VS2008,你会发现它已经安装,并SN.EXE将在这里:

C:\ Program Files文件\微软的SDK \的Windows \ v6.0A \ BIN \ SN.EXE

否则,如果你没有安装VS2008,你可以单独下载SDK 这里 。

该文件SN.EXE是不是在SDK中提供。 该SDK的最新版本是6.1,也许他们删除了此版本SN.EXE。



Answer 2:

  • 打开命令提示符
  • 类型cd \
  • dir /s sn.exe
  • 你会得到输出像

    Volume in drive C has no label.

    Volume Serial Number is XXXX-XXXX.

目录C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin

11/07/2007  12:01 PM            95,728 sn.exe
              1 File(s)         95,728 bytes

你找到的目录:)
如果没有,没有sn.exe在您的系统。 安装SDK即可。



Answer 3:

这是SDK的一部分(.NET,或现在的Windows SDK )



Answer 4:

我敢肯定,你有你的理由-有绝对充足的情况下, SN.exe是不可避免的和/或适当的(延迟签名一)。 (我+1过Q和接受了,我不争辩他们以任何方式的优点,所以请忽略这一点,如果它没有在您的案件,不适用)

需要注意的是SN.exe很少需要在实践中-在布线Microft.<lang>.targets驱动所述编译器[和AL.exe等]所有[有效]取SignAssembly在.proj文件标志考虑并有条件地传递的关键编译器(S)等,所以它可以做所有的工作在装配在线(主要用于PERF原因)的单点触摸。

这种逻辑还涉及区分.snk.pfx键(这是密码保护,得到分泌到密钥容器)。 根据该表格上,有那么无论是KeyContainerNameKeyOriginatorFile通过解决财产Microsoft.Common.targets在运行目录-搜索ResolveKeySource

如果您需要做的原因SN是因为你刚刚改写的组件,相同的图案,一般应持,即Mono.Cecil和工具一拉PostSharp(我假设,未证实)通常也采取同样的参数和/或可制成做签约的内联。


Microsoft.Common.targets摘录

<Target Name="ResolveKeySource" 
  Condition="$(SignManifests) == 'true' or $(SignAssembly) == 'true'">

  <ResolveKeySource ...
    KeyFile="$(AssemblyOriginatorKeyFile)"
    CertificateFile="$(ManifestKeyFile)"
    SuppressAutoClosePasswordPrompt="$(BuildingInsideVisualStudio)">
      <Output TaskParameter="ResolvedKeyFile" PropertyName="KeyOriginatorFile" ..."/>
      <Output TaskParameter="ResolvedKeyContainer" PropertyName="KeyContainerName" ... "/>

Microsoft.CSharp.targets摘录

    <Csc  ...
          KeyContainer="$(KeyContainerName)"
          KeyFile="$(KeyOriginatorFile)" />

为了完整起见,这里是如何以编程方式推断出相关的正在编译目标的SDK路径(在4.0,但同样的方法测试的是所有可能的方式回到2.0,即Microsoft.Common.targets已经处理这一数据在一段时间):

<Target Name="ResolveSNToolPath" Condition=" 'true' == '$(SignAssembly)' ">
    <PropertyGroup>
      <_SdkToolsBinDir Condition=" '' == '$(_SdkToolsBinDir)' ">$(TargetFrameworkSDKToolsDirectory)</_SdkToolsBinDir>
      <SNToolPath Condition=" '' == '$(SNToolPath)' ">$(_SdkToolsBinDir)SN.exe</SNToolPath>
    </PropertyGroup>
    <Error Condition=" 'true' == '$(SignAssembly)' AND !EXISTS( '$(SNToolPath)' )"
      Text="In order to resign the assembly, this package requires access to the SN.EXE tool from the Windows Platform SDK, which was not found.

The location derived was &quot;$(SNToolPath)&quot;.

Please either:
1) supply a correct path to your SDK Tools bin directory containing SN.EXE by setting %24(_SdkToolsBinDir) or %24(TargetFrameworkSDKToolsDirectory)
OR
2) supply a correct complete path to your SN.EXE signing tool by setting %24(SNToolPath)" />
  </Target>

为了全面完整,这里是你将如何利用这一进程来运行SN.EXE的输出

<Target Name="ResignMyAssembly" Condition="$(SignAssembly) == 'true'">
  <Exec Condition=" '$(KeyContainerName)' != '' " 
    Command="&quot;$(SNToolPath)&quot; -Rca &quot;@(MyAssembly)&quot; &quot;$(KeyContainerName)&quot; " />
  <Exec Condition=" '$(KeyContainerName)' == '' " 
    Command="&quot;$(SlpsSdkProtectSnTool)&quot; -Ra &quot;@(MyAssembly)&quot; &quot;$(KeyOriginatorFile)&quot; " />



Answer 5:

对于VS2017路径更改为: C:\Program Files (x86)\Microsoft SDKs\Windows\vX\bin\NETFX XXX Tools\



Answer 6:

不,看起来你需要的SDK :(

仅供参考,运行时本身不会成为下C:\Program Files\Microsoft.NET -它所有的文件都[唯一]在C:\Windows\Microsoft.NET\vXXXXXX\



文章来源: Cannot find sn.exe to sign Assembly