无法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.exe
– Microft.<lang>.targets
将驱动编译器[和AL.exe
等]全部[有效]将.proj文件中的SignAssembly
标志考虑在内并有条件地把密钥传递给编译器等等,所以它可以在一个单一的内联组件中完成所有的工作(主要是为了完整的原因)。
这个逻辑还处理.snk
和.pfx
键之间的区别(它们是密码保护的,并被分解到密钥容器中)。 取决于哪种forms,然后是运行时目录中Microsoft.Common.targets
解决的KeyContainerName
或KeyOriginatorFile
属性 – 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 "$(SNToolPath)". 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=""$(SNToolPath)" -Rca "@(MyAssembly)" "$(KeyContainerName)" " /> <Exec Condition=" '$(KeyContainerName)' == '' " Command=""$(SlpsSdkProtectSnTool)" -Ra "@(MyAssembly)" "$(KeyOriginatorFile)" " />
不,看起来像你需要的那个SDK 🙁
仅供参考,运行时本身不会在C:\Program Files\Microsoft.NET
– 所有文件都只在C:\Windows\Microsoft.NET\vXXXXXX\