1 <?xml version="1.0" encoding="utf-8"?>
2 <Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <AuthenticodeSig Condition="'$(AuthenticodeSig)' == ''">Microsoft</AuthenticodeSig>
6 <StrongNameSig Condition="'$(StrongNameSig)' == '' and '$(SignType)' == 'real' and '$(UseOpenKey)' != 'true'">StrongName</StrongNameSig>
9 <UsingTask AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" TaskName="OpenSourceSign" />
10 <UsingTask AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" TaskName="WriteSigningRequired" />
12 <PropertyGroup Condition="'$(SkipSigning)'!='true'">
14 <!-- For older support set AssemblyKey base on Use*Key properties but moving forward projects should just set AssemblyKey -->
15 <AssemblyKey Condition="'$(AssemblyKey)'=='' and '$(UseOpenKey)' == 'true'">Open</AssemblyKey>
16 <AssemblyKey Condition="'$(AssemblyKey)'=='' and '$(UseECMAKey)' == 'true'">ECMA</AssemblyKey>
17 <AssemblyKey Condition="'$(AssemblyKey)'=='' and '$(UseMSFTKey)' == 'true'">MSFT</AssemblyKey>
19 <!-- Force all test projects to use the Test key -->
20 <AssemblyKey Condition="'$(IsTestProject)' == 'true'">Test</AssemblyKey>
22 <AssemblyOriginatorKeyFile Condition="'$(AssemblyKey)' == 'MSFT'">$(ToolsDir)MSFT.snk</AssemblyOriginatorKeyFile>
23 <AssemblyOriginatorKeyFile Condition="'$(AssemblyKey)' == 'ECMA'">$(ToolsDir)ECMA.snk</AssemblyOriginatorKeyFile>
24 <AssemblyOriginatorKeyFile Condition="'$(AssemblyKey)' == 'Open'">$(ToolsDir)Open.snk</AssemblyOriginatorKeyFile>
25 <AssemblyOriginatorKeyFile Condition="'$(AssemblyKey)' == 'SilverlightPlatform'">$(ToolsDir)SilverlightPlatformPublicKey.snk</AssemblyOriginatorKeyFile>
26 <AssemblyOriginatorKeyFile Condition="'$(AssemblyKey)' == 'SilverlightExtension'">$(ToolsDir)SilverlightPublicKey.snk</AssemblyOriginatorKeyFile>
28 <StrongNameSig Condition="'$(AssemblyKey)' == 'Open'">Open</StrongNameSig>
29 <StrongNameSig Condition="'$(AssemblyKey)' == 'SilverlightPlatform'">SilverlightCert121</StrongNameSig>
30 <StrongNameSig Condition="'$(AssemblyKey)' == 'SilverlightExtension'">MsSharedLib</StrongNameSig>
32 <!-- Don't sign test assemblies with the Microsoft Key, as this affects APIs checking if the test assembly is an MS Key -->
33 <AssemblyOriginatorKeyFile Condition="'$(AssemblyKey)' == 'Test'">$(ToolsDir)Test.snk</AssemblyOriginatorKeyFile>
35 <SignAssembly>true</SignAssembly>
36 <DelaySign>true</DelaySign>
38 <DelaySign Condition="'$(AssemblyKey)' == 'Test'">false</DelaySign>
41 Setting DelaySign to true when running build on unix because of Roslyn doesn't support full signing on non-windows.
42 See issue https://github.com/dotnet/roslyn/issues/8210.
44 <DelaySign Condition="'$(RunningOnUnix)' == 'true'">true</DelaySign>
46 <DefineConstants>$(DefineConstants);SIGNED</DefineConstants>
48 <!-- applicable values for SignType are public, test or real -->
49 <SignType Condition="'$(SignType)' == ''">public</SignType>
51 <ShouldWriteSigningRequired Condition="'$(IsTestProject)' == 'true'">false</ShouldWriteSigningRequired>
52 <ShouldWriteSigningRequired Condition="'$(SkipSigning)' == 'true'">false</ShouldWriteSigningRequired>
53 <ShouldWriteSigningRequired Condition="'$(SignType)' == 'public' or '$(SignType)' == 'oss'">false</ShouldWriteSigningRequired>
54 <ShouldWriteSigningRequired Condition="'$(ShouldWriteSigningRequired)'==''">true</ShouldWriteSigningRequired>
56 <ShouldOpenSourceSign Condition="'$(SignType)' == 'public' or '$(SignType)' == 'oss'">$(DelaySign)</ShouldOpenSourceSign>
57 <ShouldOpenSourceSign Condition="'$(SkipSigning)' == 'true'">false</ShouldOpenSourceSign>
60 <!-- stub for signing. for official builds this is replaced with the real one -->
61 <Target Name="SignFiles" AfterTargets="AfterBuild" />
63 <Target Name="SignFilesLocally"
64 BeforeTargets="SignFiles"
65 Condition="'$(RunningOnUnix)' != 'true'">
68 <FilesToSignLocally Include="@(FilesToSign)" Condition="'%(FilesToSign.StrongName)' == 'Open'">
69 <AssemblyKeyFile>$(ToolsDir)Open.snk</AssemblyKeyFile>
71 <!-- Clear out the strong name metadata for open keys -->
72 <FilesToSign Condition="'%(FilesToSign.StrongName)' == 'Open'">
73 <StrongName></StrongName>
77 <!-- Depends on sn being on the path thus will only work in some windows environments -->
78 <Exec Condition="'@(FilesToSignLocally)' != ''"
79 Command="sn -R %(FilesToSignLocally.Identity) %(FilesToSignLocally.AssemblyKeyFile)"
80 StandardOutputImportance="Low" />
83 <!-- writes a signing marker file containing the required signatures -->
84 <Target Name="WriteSigningRequired"
85 AfterTargets="AfterBuild"
86 Condition="'$(ShouldWriteSigningRequired)' == 'true'"
87 Inputs="$(TargetPath)"
88 Outputs="$(TargetPath).requires_signing">
89 <WriteSigningRequired AuthenticodeSig="$(AuthenticodeSig)"
90 StrongNameSig="$(StrongNameSig)"
91 MarkerFile="$(TargetPath).requires_signing" />
93 <FileWrites Include="%(IntermediateAssembly.Identity).requires_signing" />
98 NOTE: This mechanism for wiring in the OpenSourceSign target can't be changed to any of the following:
100 * AfterTargets=Compile -> hit by intellisense builds while @(IntermediateAssembly) doesn't exist yet.
101 * AfterTargets=PrepareForRun -> hit after @(IntermediateAssembly) has already been copied to output.
102 * BeforeTargets=CopyFilesToOutputDirectory -> does not work on Mono.
105 <PrepareForRunDependsOn>OpenSourceSign;$(PrepareForRunDependsOn)</PrepareForRunDependsOn>
108 <Target Name="OpenSourceSign"
109 Condition="'$(ShouldOpenSourceSign)' == 'true' and '@(IntermediateAssembly)' != ''"
110 Inputs="@(IntermediateAssembly)"
111 Outputs="%(IntermediateAssembly.Identity).oss_signed"
113 <OpenSourceSign AssemblyPath="%(IntermediateAssembly.Identity)" />
114 <Touch Files="%(IntermediateAssembly.Identity).oss_signed" AlwaysCreate="true" />
116 <FileWrites Include="%(IntermediateAssembly.Identity).oss_signed" />