C# 找不到要对程序集进行签名的sn.exe

C# 找不到要对程序集进行签名的sn.exe,c#,msbuild,sn.exe,C#,Msbuild,Sn.exe,我查看了C:\Program Files\Microsoft.NET,没有看到任何SN.exe文件 我已经安装了.NET3.5运行时;这还不够吗?它是SDK的一部分(.NET,或现在的)不,看起来您需要SDK来实现这一点:( 仅供参考,运行时本身不在C:\Program Files\Microsoft.NET下——它的所有文件[仅]在C:\Windows\Microsoft.NET\VXXXXX\下,您需要安装Windows SDK 6.0a,而不仅仅是运行时 如果您已安装VS2008,您会发现

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


我已经安装了.NET3.5运行时;这还不够吗?

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

不,看起来您需要SDK来实现这一点:(


仅供参考,运行时本身不在
C:\Program Files\Microsoft.NET
下——它的所有文件[仅]在
C:\Windows\Microsoft.NET\VXXXXX\

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

如果您已安装VS2008,您会发现它已安装,sn.exe将出现在此处:

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

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

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

  • 打开命令提示符
  • 键入
    cd\
  • 键入
    dir/s sn.exe
  • 您将得到如下输出

    驱动器C中的卷没有标签。

    卷序列号为XXXX-XXXX。

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

11/07/2007  12:01 PM            95,728 sn.exe
              1 File(s)         95,728 bytes
您找到了目录:)
如果没有,则系统中没有
sn.exe
。然后安装SDK。

我相信你有你的理由——而且肯定有很多情况下,
SN.exe
是不可避免和/或合适的(延迟签名)(我已经+1了Q和接受了A,我不会以任何方式质疑他们的优点,因此如果这不适用于您的情况,请忽略)

请注意,实际上很少需要
SN.exe
,驱动编译器的
Microft..targets
中的连线[和
AL.exe
等]都[有效地]考虑到.proj文件中的
SignAssembly
标志,并有条件地将密钥传递给编译器因此,它可以在一次内联组装中完成所有工作(主要是出于性能原因)

此逻辑还处理
.snk
.pfx
密钥之间的区别(受密码保护并隐藏在密钥容器中)。根据哪种形式,然后在运行时目录中有一个
KeyContainerName
KeyOriginatorFile
属性,由
Microsoft.Common.targets
解析-搜索
ResolveKeySource

如果您需要执行
SN
的原因是因为您刚刚重写了一个程序集,那么相同的模式通常应该保持不变,即
Mono.Cecil
和tools a la PostSharp(我假设,未确认)通常也采用相同的参数和/或可以进行内联签名


Microsoft.Common.targets摘录
为了完整起见,下面是如何利用此流程的输出来运行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; " />


VS2017的路径已更改为:
C:\Program Files(x86)\Microsoft SDK\Windows\vX\bin\NETFX.X.X Tools\

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

现在我仍然无法使用VS命令提示符。它向我显示了这样的信息

**Visual Studio 2017开发者命令提示符v15.8.9 **版权所有(c)2017微软公司

[vcvarsall.bat]环境已初始化为:“x64”

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

只需:

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

C:\ProgramFiles(x86)\Microsoft SDK\Windows\v8.1A\bin\NETFX 4.5.1 工具

编写sn.exe命令:

sn -i D:\XX\MYProject.UI.api\MYProject.Gateway\my_certificate.pfx VS_KEY_AD6FD8AFB39B6C43

如果受密码保护,则需要pwd将其写下来

否,即运行时文件夹。其中包含一些工具,但不包含sn。@HenkHolterman(和OP)编辑了答案以使其更清晰。我认为a)有一点很重要,其他答案没有涵盖b)我们都应该删除我们的评论,因为它们对答案没有意义,因为答案是c)如果有一致意见,否决票的选民应该删除否决票。至于我将如何记得删除此…:)64位版本如何?对于我来说,在使用VS2010的Windows 7 64位上,sn.exe的路径是
C:\Program Files(x86)\Microsoft SDK\Windows\v7.0A\Bin\sn.exe
链接已断开。如果使用Visual Studio命令提示符,它应该可以立即运行
<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>
<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; " />
sn -i D:\XX\MYProject.UI.api\MYProject.Gateway\my_certificate.pfx VS_KEY_AD6FD8AFB39B6C43