@@ -11,28 +11,100 @@ runs:
1111 run : |
1212 $ErrorActionPreference = "Stop";
1313
14- foreach($project in Get-ChildItem -Path . -Filter *.csproj -Recurse -Force) {
15- dotnet add $project package SecurityCodeScan.VS2019
16-
14+ foreach($project in Get-ChildItem -Path . -Filter *.??proj -Recurse -Force) {
15+
1716 $xml = [xml](Get-Content -Path $project)
17+ if (-not $xml.Project.xmlns) {
18+ dotnet add $project package SecurityCodeScan.VS2019
19+ $xml = [xml](Get-Content -Path $project)
20+ }
21+ else {
22+ $packageId = "SecurityCodeScan.VS2019"
23+ $packageVersion = "5.0.0"
24+ $packages = $project | Split-Path -parent
25+ $packages = Join-Path $packages "packages.config"
1826
19- $errorLog = $xml.CreateElement("ErrorLog")
20- $errorLog.set_InnerText("analysis.sarif")
21- $propertyGroups = $xml.SelectNodes("//Project/PropertyGroup")
22- $propertyGroups[0].AppendChild($errorLog)
27+ $id = get-random
28+ $code = @"
29+ using System;
30+ using System.Runtime.Versioning;
31+ using System.Text.RegularExpressions;
32+ using System.Xml;
2333
24- $xml.Save($project)
34+ public class Program$id
35+ {
36+ public static void Main(){
37+ var projXml = new XmlDocument();
38+ projXml.Load(@"$project");
39+
40+ var xmlNamespace = "http://schemas.microsoft.com/developer/msbuild/2003";
41+ var nsmgr = new XmlNamespaceManager(projXml.NameTable);
42+ nsmgr.AddNamespace("x", xmlNamespace);
43+
44+ XmlNode itemGroupNode = projXml.CreateNode(XmlNodeType.Element, "ItemGroup", xmlNamespace);
45+ XmlNode analyzerNode = projXml.CreateNode(XmlNodeType.Element, "Analyzer", xmlNamespace);
46+ XmlAttribute includeAttribute = projXml.CreateAttribute("Include");
47+ includeAttribute.Value = $@"..\packages\$packageId.$packageVersion\analyzers\dotnet\SecurityCodeScan.VS2019.dll";
48+ analyzerNode.Attributes.Append(includeAttribute);
49+ itemGroupNode.AppendChild(analyzerNode);
50+ projXml.SelectSingleNode("//x:Project", nsmgr).AppendChild(itemGroupNode);
51+ projXml.Save(@"$project");
52+
53+ XmlNode targetFrameworkNode = projXml.SelectSingleNode("//x:TargetFrameworkVersion", nsmgr);
54+ var targetFwAttribute = new TargetFrameworkAttribute($".NETFramework, Version={targetFrameworkNode.InnerXml}");
55+ Regex p = new Regex(@"\d+(\.\d+)+");
56+ Match m = p.Match(targetFwAttribute.FrameworkName);
57+ Version targetFwVersion = Version.Parse(m.Value);
58+
59+ var packagesXml = new XmlDocument();
60+ packagesXml.Load(@"$packages");
61+
62+ var packagesNode = packagesXml.SelectSingleNode("//packages");
63+
64+ XmlNode packageNode = packagesXml.CreateElement("package");
65+
66+ XmlAttribute idAttribute = packagesXml.CreateAttribute("id");
67+ idAttribute.Value = "$packageId";
68+ packageNode.Attributes.Append(idAttribute);
69+
70+ XmlAttribute versionAttribute = packagesXml.CreateAttribute("version");
71+ versionAttribute.Value = "$packageVersion";
72+ packageNode.Attributes.Append(versionAttribute);
73+
74+ XmlAttribute targetFrameworkAttribute = packagesXml.CreateAttribute("targetFramework");
75+ targetFrameworkAttribute.Value = $"net{targetFwVersion.ToString().Replace(".", "")}";
76+ packageNode.Attributes.Append(targetFrameworkAttribute);
77+
78+ XmlAttribute developmentDependencyAttribute = packagesXml.CreateAttribute("developmentDependency");
79+ developmentDependencyAttribute.Value = "true";
80+ packageNode.Attributes.Append(developmentDependencyAttribute);
81+
82+ packagesNode.AppendChild(packageNode);
83+ packagesXml.Save(@"$packages");
84+ }
2585 }
86+ "@
2687
27- foreach($project in Get-ChildItem -Path . -Filter *.vbproj -Recurse -Force) {
28- dotnet add $project package SecurityCodeScan.VS2019
29-
30- $xml = [xml](Get-Content -Path $project)
88+ Add-Type -TypeDefinition $code -Language CSharp
89+ Invoke-Expression "[Program$id]::Main()"
90+ }
91+
92+ if ($xml.Project.xmlns) {
93+ $nsmgr = New-Object System.Xml.XmlNamespaceManager $xml.NameTable
94+ $nsmgr.AddNamespace('x','http://schemas.microsoft.com/developer/msbuild/2003')
95+ $x = 'x:'
96+ }
97+ $propertyGroups = $xml.SelectNodes("//${x}Project/${x}PropertyGroup", $nsmgr)
3198
3299 $errorLog = $xml.CreateElement("ErrorLog")
33100 $errorLog.set_InnerText("analysis.sarif")
34- $propertyGroups = $xml.SelectNodes("//Project/PropertyGroup")
35101 $propertyGroups[0].AppendChild($errorLog)
36102
103+ if (-not $propertyGroups[0].AdditionalFileItemNames) {
104+ $additionalFileItemNamesElt = $xml.CreateElement("AdditionalFileItemNames")
105+ $additionalFileItemNamesElt.set_InnerText('$(AdditionalFileItemNames);Content')
106+ $propertyGroups[0].AppendChild($additionalFileItemNamesElt)
107+ }
108+
37109 $xml.Save($project)
38110 }
0 commit comments