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=""$(SNToolPath)" -Rca "@(MyAssembly)" "$(KeyContainerName)" " />
<Exec Condition=" '$(KeyContainerName)' == '' "
Command=""$(SlpsSdkProtectSnTool)" -Ra "@(MyAssembly)" "$(KeyOriginatorFile)" " />
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 "$(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>
<Target Name="ResignMyAssembly" Condition="$(SignAssembly) == 'true'">
<Exec Condition=" '$(KeyContainerName)' != '' "
Command=""$(SNToolPath)" -Rca "@(MyAssembly)" "$(KeyContainerName)" " />
<Exec Condition=" '$(KeyContainerName)' == '' "
Command=""$(SlpsSdkProtectSnTool)" -Ra "@(MyAssembly)" "$(KeyOriginatorFile)" " />
sn -i D:\XX\MYProject.UI.api\MYProject.Gateway\my_certificate.pfx VS_KEY_AD6FD8AFB39B6C43