From e80a4a2f5c85195fe6e4ad489369942950a6be9a Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 29 Sep 2019 12:18:20 +0200 Subject: [PATCH] Use .NET Core 3.0 in Unit Tests Roslyn config. --- .../Helpers/RemoveCompilerAttribute.cs | 2 +- .../Helpers/Tester.cs | 48 ++++++++++++------- .../Metadata/DotNetCorePathFinder.cs | 11 +++-- .../Metadata/UniversalAssemblyResolver.cs | 4 +- 4 files changed, 42 insertions(+), 23 deletions(-) diff --git a/ICSharpCode.Decompiler.Tests/Helpers/RemoveCompilerAttribute.cs b/ICSharpCode.Decompiler.Tests/Helpers/RemoveCompilerAttribute.cs index 214dda115..f75ca7a41 100644 --- a/ICSharpCode.Decompiler.Tests/Helpers/RemoveCompilerAttribute.cs +++ b/ICSharpCode.Decompiler.Tests/Helpers/RemoveCompilerAttribute.cs @@ -13,7 +13,7 @@ namespace ICSharpCode.Decompiler.Tests.Helpers var section = (AttributeSection)attribute.Parent; SimpleType type = attribute.Type as SimpleType; if (section.AttributeTarget == "assembly" && - (type.Identifier == "CompilationRelaxations" || type.Identifier == "RuntimeCompatibility" || type.Identifier == "SecurityPermission" || type.Identifier == "PermissionSet" || type.Identifier == "AssemblyVersion" || type.Identifier == "Debuggable")) + (type.Identifier == "CompilationRelaxations" || type.Identifier == "RuntimeCompatibility" || type.Identifier == "SecurityPermission" || type.Identifier == "PermissionSet" || type.Identifier == "AssemblyVersion" || type.Identifier == "Debuggable" || type.Identifier == "TargetFramework")) { attribute.Remove(); if (section.Attributes.Count == 0) diff --git a/ICSharpCode.Decompiler.Tests/Helpers/Tester.cs b/ICSharpCode.Decompiler.Tests/Helpers/Tester.cs index f17a64a52..7d19e0a32 100644 --- a/ICSharpCode.Decompiler.Tests/Helpers/Tester.cs +++ b/ICSharpCode.Decompiler.Tests/Helpers/Tester.cs @@ -186,21 +186,36 @@ namespace ICSharpCode.Decompiler.Tests.Helpers @"Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2"); static readonly string thisAsmPath = Path.GetDirectoryName(typeof(Tester).Assembly.Location); - static readonly Lazy> defaultReferences = new Lazy>(delegate { - return new[] - { - MetadataReference.CreateFromFile(Path.Combine(refAsmPath, "Facades\\netstandard.dll")), - MetadataReference.CreateFromFile(Path.Combine(refAsmPath, "mscorlib.dll")), - MetadataReference.CreateFromFile(Path.Combine(refAsmPath, "System.dll")), - MetadataReference.CreateFromFile(Path.Combine(refAsmPath, "System.Core.dll")), - MetadataReference.CreateFromFile(Path.Combine(refAsmPath, @"Facades\System.Runtime.dll")), - MetadataReference.CreateFromFile(Path.Combine(refAsmPath, "System.Xml.dll")), - MetadataReference.CreateFromFile(Path.Combine(refAsmPath, "Microsoft.CSharp.dll")), - MetadataReference.CreateFromFile(typeof(ValueTuple).Assembly.Location), - MetadataReference.CreateFromFile(typeof(ValueTask).Assembly.Location), - MetadataReference.CreateFromFile(typeof(Span<>).Assembly.Location), - }; - }); + static readonly Lazy> defaultReferences = new Lazy>(GetDefaultReferences); + + static readonly string[] references = new string[] { + "netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51", + "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", + "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", + "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", + "System.Runtime, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", + "System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", + "Microsoft.CSharp, Version=4.0.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", + "System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e", + "System.Console, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + }; + + const string targetFrameworkAttributeSnippet = @" + +[assembly: System.Runtime.Versioning.TargetFramework("".NETCoreApp, Version = v3.0"", FrameworkDisplayName = """")] + +"; + + static IEnumerable GetDefaultReferences() + { + DotNetCorePathFinder pathFinder = new DotNetCorePathFinder(new Version(3, 0)); + foreach (var reference in references) { + var result = pathFinder.TryResolveDotNetCore(AssemblyNameReference.Parse(reference)); + if (result != null) { + yield return MetadataReference.CreateFromFile(result); + } + } + } static readonly Lazy> visualBasic = new Lazy>(delegate { return new[] { @@ -252,6 +267,7 @@ namespace ICSharpCode.Decompiler.Tests.Helpers languageVersion: Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp8 ); var syntaxTrees = sourceFileNames.Select(f => SyntaxFactory.ParseSyntaxTree(File.ReadAllText(f), parseOptions, path: f)); + syntaxTrees = syntaxTrees.Concat(new[] { SyntaxFactory.ParseSyntaxTree(targetFrameworkAttributeSnippet) }); var references = defaultReferences.Value; if (flags.HasFlag(CompilerOptions.ReferenceVisualBasic)) { references = references.Concat(visualBasic.Value); @@ -446,7 +462,7 @@ namespace ICSharpCode.Decompiler.Tests.Helpers settings = new DecompilerSettings(); using (var file = new FileStream(assemblyFileName, FileMode.Open, FileAccess.Read)) { var module = new PEFile(assemblyFileName, file, PEStreamOptions.PrefetchEntireImage); - var resolver = new UniversalAssemblyResolver(assemblyFileName, false, + var resolver = new UniversalAssemblyResolver(assemblyFileName, true, module.Reader.DetectTargetFrameworkId(), PEStreamOptions.PrefetchMetadata); resolver.AddSearchDirectory(Path.GetDirectoryName(typeof(Span<>).Assembly.Location)); var typeSystem = new DecompilerTypeSystem(module, resolver, settings); diff --git a/ICSharpCode.Decompiler/Metadata/DotNetCorePathFinder.cs b/ICSharpCode.Decompiler/Metadata/DotNetCorePathFinder.cs index 91937943b..66f2a652b 100644 --- a/ICSharpCode.Decompiler/Metadata/DotNetCorePathFinder.cs +++ b/ICSharpCode.Decompiler/Metadata/DotNetCorePathFinder.cs @@ -62,15 +62,18 @@ namespace ICSharpCode.Decompiler.Metadata readonly Dictionary packages; ISet packageBasePaths = new HashSet(StringComparer.Ordinal); - readonly string assemblyName; - readonly string basePath; readonly Version version; readonly string dotnetBasePath = FindDotNetExeDirectory(); + public DotNetCorePathFinder(Version version) + { + this.version = version; + } + public DotNetCorePathFinder(string parentAssemblyFileName, string targetFrameworkId, Version version, ReferenceLoadInfo loadInfo = null) { - this.assemblyName = Path.GetFileNameWithoutExtension(parentAssemblyFileName); - this.basePath = Path.GetDirectoryName(parentAssemblyFileName); + string assemblyName = Path.GetFileNameWithoutExtension(parentAssemblyFileName); + string basePath = Path.GetDirectoryName(parentAssemblyFileName); this.version = version; var depsJsonFileName = Path.Combine(basePath, $"{assemblyName}.deps.json"); diff --git a/ICSharpCode.Decompiler/Metadata/UniversalAssemblyResolver.cs b/ICSharpCode.Decompiler/Metadata/UniversalAssemblyResolver.cs index d7b5ae5aa..a1326df37 100644 --- a/ICSharpCode.Decompiler/Metadata/UniversalAssemblyResolver.cs +++ b/ICSharpCode.Decompiler/Metadata/UniversalAssemblyResolver.cs @@ -101,7 +101,7 @@ namespace ICSharpCode.Decompiler.Metadata AddSearchDirectory(baseDirectory); } - (TargetFrameworkIdentifier, Version) ParseTargetFramework(string targetFramework) + static (TargetFrameworkIdentifier, Version) ParseTargetFramework(string targetFramework) { string[] tokens = targetFramework.Split(','); TargetFrameworkIdentifier identifier; @@ -131,7 +131,7 @@ namespace ICSharpCode.Decompiler.Metadata switch (pair[0].Trim().ToUpperInvariant()) { case "VERSION": - var versionString = pair[1].TrimStart('v'); + var versionString = pair[1].TrimStart('v', ' ', '\t'); if (identifier == TargetFrameworkIdentifier.NETCoreApp || identifier == TargetFrameworkIdentifier.NETStandard) {