找不到sn.exe来签署程序集

时间:2009-10-08 06:06:38

标签: c# msbuild sn.exe

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

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

8 个答案:

答案 0 :(得分:78)

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

如果你已经安装了VS2008,你会发现它已经安装了,sn.exe将在这里:

C:\ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ Bin \ sn.exe

否则,如果您没有安装VS2008,可以单独下载SDK here

SDK中没有文件sn.exe。当前版本的SDK是6.1,也许他们在此版本中删除了sn.exe。

答案 1 :(得分:16)

  • 打开命令提示符
  • 输入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。

答案 2 :(得分:3)

它是SDK(.NET,现在是Windows SDK

的一部分

答案 3 :(得分:3)

我确定你有理由 - 并且肯定有很多情况SN.exe是不可避免的和/或适当的(延迟签名)。 (我已经给Q和接受的A加了1分,并且不以任何方式质疑他们的优点,所以如果它不适用于你的情况请忽略它) < / p>

请注意,在实践中很少需要SN.exe - Microft.<lang>.targets中用于驱动编译器[和AL.exe等]的所有[有效]采用SignAssembly标志在.proj文件中考虑并有条件地将密钥传递给编译器等,这样它只需单击内联组件即可完成所有工作(主要是出于性能原因)。

此逻辑还处理.snk.pfx键之间的区别(它们受密码保护并被分配到密钥容器中)。根据哪种形式,运行时目录中的KeyContainerName解析KeyOriginatorFileMicrosoft.Common.targets属性 - 搜索ResolveKeySource

如果您需要执行SN的原因是因为您刚刚重写了一个程序集,那么通常应该保持相同的模式,即Mono.Cecil和工具a 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; " />

答案 4 :(得分:3)

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

答案 5 :(得分:1)

不,看起来你需要SDK :(

仅供参考,运行时本身不会在C:\Program Files\Microsoft.NET下 - 所有文件只在[{1}}

下生活

答案 6 :(得分:0)

对于VS2019,路径为C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.7.2 Tools \ x64 \ sn.exe

现在仍然无法使用VS命令提示符。它向我显示类似消息

** Visual Studio 2017开发人员命令提示符v15.8.9 **版权所有(c)2017 Microsoft Corporation

[vcvarsall.bat]环境初始化为:'x64'

C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Community>其中sn.exe INFO:找不到给定模式的文件。

答案 7 :(得分:0)

简单地:

在Windows中(根据.net框架版本 \ B8.1A .. 的路径更改),转到=>

  

C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1   工具

编写您的 sn.exe 命令:

['barley', 'rapeseed', 'wheat']
['fertilizer']

如果受密码保护,那么它将要求密码将其写下来