J'ai regardé dans C:\Program Files\Microsoft.NET
et je ne peux pas voir SN.exe
fichier.
J'ai installé le runtime .NET 3.5, n'est-ce pas suffisant ?
J'ai regardé dans C:\Program Files\Microsoft.NET
et je ne peux pas voir SN.exe
fichier.
J'ai installé le runtime .NET 3.5, n'est-ce pas suffisant ?
Vous devez installer le SDK Windows 6.0a, pas seulement le runtime.
Si vous avez installé VS2008, vous constaterez qu'il est déjà installé, et que sn.exe se trouve ici :
C:\Program Fichiers \Microsoft SDKs \Windows\v6.0A\Bin\sn.exe
Sinon, si vous n'avez pas installé VS2008, vous pouvez télécharger le SDK individuellement. ici .
Le fichier sn.exe n'est pas disponible dans le SDK. La version actuelle du SDK est 6.1, peut-être ont-ils supprimé sn.exe dans cette version.
cd \
dir /s sn.exe
vous obtiendrez un résultat comme
Volume in drive C has no label.
Volume Serial Number is XXXX-XXXX.
Répertoire des 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
Vous avez trouvé le répertoire :)
si non, il n'y a pas de sn.exe
dans votre système. Installez ensuite le SDK.
Je suis sûr que vous avez vos raisons et il y a certainement beaucoup de cas où SN.exe
est inévitable et/ou appropriée (retarder la signature, par exemple). (Et j'ai fait +1 au Q et au A accepté et je ne conteste en aucun cas leur mérite, alors ne tenez pas compte de ceci si cela ne s'applique pas à votre cas).
Notez que SN.exe
est rarement nécessaire dans la pratique - le câblage en Microft.<lang>.targets
qui pilotent les compilateurs [et AL.exe
etc.] prennent tous [effectivement] le SignAssembly
dans le fichier .proj et transmettre conditionnellement la clé au(x) compilateur(s), etc. afin qu'il puisse effectuer tout le travail en une seule touche de l'assemblage en ligne (principalement pour des raisons de performance).
Cette logique traite également de la distinction entre .snk
et .pfx
les clés (qui sont protégées par un mot de passe et sont cachées dans un conteneur de clés). En fonction du formulaire, il y a ensuite soit une KeyContainerName
ou KeyOriginatorFile
propriété résolue par Microsoft.Common.targets
dans le répertoire Runtime - Recherchez ResolveKeySource
.
Si la raison pour laquelle vous devez faire un SN
c'est parce que vous venez de réécrire un assemblage, le même schéma devrait généralement s'appliquer, c'est à dire Mono.Cecil
et les outils à la PostSharp (je suppose, non confirmé) prennent généralement aussi les mêmes arguments et/ou peuvent être faits pour faire la signature en ligne.
<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" ... "/>
<Csc ...
KeyContainer="$(KeyContainerName)"
KeyFile="$(KeyOriginatorFile)" />
Pour être complet, voici comment déduire par programmation le chemin du SDK correspondant à la cible que vous compilez (testé sur la version 4.0 mais la même approche est possible depuis la version 2.0). Microsoft.Common.targets
traite ces données depuis un certain temps) :
<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>
Pour être tout à fait complet, voici comment vous pourriez exploiter les résultats de ce processus pour exécuter SN.exe
<Target Name="ResignMyAssembly" Condition="$(SignAssembly) == 'true'">
<Exec Condition=" '$(KeyContainerName)' != '' "
Command=""$(SNToolPath)" -Rca "@(MyAssembly)" "$(KeyContainerName)" " />
<Exec Condition=" '$(KeyContainerName)' == '' "
Command=""$(SlpsSdkProtectSnTool)" -Ra "@(MyAssembly)" "$(KeyOriginatorFile)" " />
Il fait partie du SDK (.NET, ou maintenant le SDK Windows )
@HenkHolterman (et OP) ont modifié la réponse pour la rendre plus claire. Je soumets que a) il y avait un point important que les autres réponses ne couvraient pas b) nous devrions tous retirer nos commentaires car ils n'ont pas de sens avec la réponse telle qu'elle est c) le downvote devrait retirer le downvote en supposant qu'il y ait un accord. Quant à savoir comment je vais me souvenir de supprimer ceci... :)
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Si vous utilisez l'invite de commande de Visual Studio, cela devrait fonctionner sans problème.