无法findsn.exe签署大会

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

我有.NET 3.5运行时安装; 这不够吗?

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

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

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

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

文件sn.exe在SDK中不可用。 SDK的当前版本是6.1,或许他们在本版本中删除了sn.exe。

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

你find了这个目录:)
如果没有,系统中没有sn.exe 。 然后安装SDK。

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

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

请注意, SN.exe很less需要SN.exeMicroft.<lang>.targets将驱动编译器[和AL.exe等]全部[有效]将.proj文件中的SignAssembly标志考虑在内并有条件地把密钥传递给编译器等等,所以它可以在一个单一的内联组件中完成所有的工作(主要是为了完整的原因)。

这个逻辑还处理.snk.pfx键之间的区别(它们是密码保护的,并被分解到密钥容器中)。 取决于哪种forms,然后是运行时目录中Microsoft.Common.targets解决的KeyContainerNameKeyOriginatorFile属性 – searchResolveKeySource

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

为了完整起见,下面介绍如何以编程方式推断与正在编译的目标相关的SDKpath(在4.0上进行了testing,但是可能一直回到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; " /> 

不,看起来像你需要的那个SDK 🙁

仅供参考,运行时本身不会在C:\Program Files\Microsoft.NET – 所有文件都只在C:\Windows\Microsoft.NET\vXXXXXX\