Не удается найти sn.exe для подписи сборки
Я смотрел в C:\Program Files\Microsoft.NET
и я не вижу ни одного SN.exe
файл.
У меня установлена среда выполнения.NET 3.5; разве этого недостаточно?
6 ответов
Вам нужно установить 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
Вы нашли каталог:)
если нет, то нет sn.exe
в вашей системе. Затем установите SDK.
Я уверен, что у вас есть свои причины - и, безусловно, есть много случаев, когда SN.exe
неизбежен и / или уместен (задержка подписи для одного). (И я добавил +1 к Q и Accepted A и не оспариваю их достоинства, поэтому не обращайте на это внимания, если это не применимо в вашем случае)
Обратите внимание, что SN.exe
на практике редко требуется - проводка в Microft.<lang>.targets
которые управляют компиляторами [и AL.exe
и т.д.] все [эффективно] принимают SignAssembly
пометьте в файле.proj учетную запись и условно передайте ключ компилятору (-ам) и т. д., чтобы он мог выполнять всю работу одним касанием встроенной сборки (в основном по соображениям производительности).
Эта логика также касается различия между .snk
а также .pfx
ключи (которые защищены паролем и секретируются в контейнер ключей). В зависимости от того, какая форма KeyContainerName
или же KeyOriginatorFile
собственность разрешена Microsoft.Common.targets
в каталоге Runtime - поиск ResolveKeySource
,
Если причина вам нужно сделать SN
потому что вы только что переписали сборку, тот же шаблон должен обычно храниться, т.е. Mono.Cecil
и инструменты а-ля PostSharp (я полагаю, не подтвержденные), как правило, также принимают те же аргументы и / или могут быть использованы для выполнения подписи inline.
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 "$(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)" " />
Для VS2017 путь был изменен на:C:\Program Files (x86)\Microsoft SDKs\Windows\vX\bin\NETFX X.X.X Tools\
,
Просто:
В окнах (согласно версии .NET Framework \B8.1A.. изменяется путь) перейдите в =>
C: \ Program Files (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 записал его
Нет, похоже, вам нужен SDK для этого:(
К вашему сведению, сама среда выполнения не была бы под C:\Program Files\Microsoft.NET
- все его файлы живут [только] под C:\Windows\Microsoft.NET\vXXXXXX\
Для VS2019 путь: C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\x64\sn.exe
до сих пор я не могу использовать командную строку VS. он показывает мне сообщение вроде
** Командная строка разработчика Visual Studio 2017 версии 15.8.9 ** Авторское право (c) Корпорация Майкрософт, 2017 г.
[vcvarsall.bat] Среда инициализирована для: 'x64'
C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community>, где sn.exe ИНФОРМАЦИЯ: не удалось найти файлы для данного шаблона (ов).