c# - No se puede encontrar sn.exe para firmar Assembly
msbuild (5)
Es parte del SDK (.NET, o ahora el SDK de Windows )
Miré en C:/Program Files/Microsoft.NET
y no puedo ver ningún archivo SN.exe
.
Tengo .NET 3.5 tiempo de ejecución instalado; ¿No es eso suficiente?
Necesita instalar Windows SDK 6.0a, no solo el tiempo de ejecución.
Si instaló VS2008, verá que ya está instalado y sn.exe estará aquí:
C: / Archivos de programa / Microsoft SDKs / Windows / v6.0A / Bin / sn.exe
De lo contrario, si no tiene VS2008 instalado, puede descargar el SDK de forma individual here .
El archivo sn.exe no está disponible en el SDK. La versión actual del SDK es 6.1, quizás eliminaron sn.exe en esta versión.
No, parece que necesitas el SDK para eso :(
FYI, el Runtime en sí mismo no estaría bajo C:/Program Files/Microsoft.NET
- todos sus archivos en vivo [solo] en C:/Windows/Microsoft.NET/vXXXXXX/
Estoy seguro de que tiene sus razones, y definitivamente hay muchos casos en los que SN.exe
es inevitable y / o apropiado (Delay Signing para uno). (Y he hecho +1 en la Q y en la A aceptada y no discuto sus méritos de ninguna manera, así que por favor desestime esto si no se aplica en su caso)
Tenga en cuenta que SN.exe
rara vez se necesita en la práctica: el cableado de Microft.<lang>.targets
que dirigen los compiladores [y AL.exe
etc.] todos [efectivamente] toman el indicador SignAssembly
en el archivo .proj en cuenta y condicionalmente pase la clave del (de los) compilador (es), etc. para que pueda hacer todo el trabajo en un solo toque del ensamblaje en línea (principalmente por razones de rendimiento).
Esta lógica también se ocupa de la distinción entre las claves .snk
y .pfx
(que están protegidas con contraseña y se ocultan en un contenedor de claves). Dependiendo de qué forma, existe una propiedad KeyContainerName
o KeyOriginatorFile
resuelta por Microsoft.Common.targets
en el directorio Runtime - Buscar ResolveKeySource
.
Si la razón por la que necesita hacer un SN
es porque acaba de reescribir un ensamblado, el mismo patrón generalmente debería ser Mono.Cecil
, es decir, Mono.Cecil
y herramientas a la PostSharp (supongo, no confirmado) generalmente también toman los mismos argumentos y / o se puede hacer para hacer la firma en línea.
Extracto de 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" ... "/>
Extracto de Microsoft.CSharp.targets
<Csc ...
KeyContainer="$(KeyContainerName)"
KeyFile="$(KeyOriginatorFile)" />
Para más información, a continuación le mostramos cómo inferir de manera programática la ruta SDK relevante para el objetivo que está compilando (probado en 4.0, pero el mismo enfoque es posible hasta 2.0, es decir, Microsoft.Common.targets
ha procesado estos datos durante un tiempo):
<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>
Para una integridad total, así es como aprovecharías los resultados de este proceso para ejecutar SN.exe
<Target Name="ResignMyAssembly" Condition="$(SignAssembly) == ''true''">
<Exec Condition=" ''$(KeyContainerName)'' != '''' "
Command=""$(SNToolPath)" -Rca "@(MyAssembly)" "$(KeyContainerName)" " />
<Exec Condition=" ''$(KeyContainerName)'' == '''' "
Command=""$(SlpsSdkProtectSnTool)" -Ra "@(MyAssembly)" "$(KeyOriginatorFile)" " />
- abrir símbolo del sistema
- escriba
cd /
- tipo
dir /s sn.exe
obtendrá resultados como algo
Volume in drive C has no label.
Volume Serial Number is XXXX-XXXX.
Directorio de 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
Encontraste el directorio :)
si no, no hay sn.exe
en su sistema. Instalar SDK luego.