@@ -98,6 +98,7 @@ public static partial class Tester
9898 static readonly string roslynLatestVersion ;
9999 static readonly RoslynToolset roslynToolset ;
100100 static readonly VsWhereToolset vswhereToolset ;
101+ internal static readonly RefAssembliesToolset RefAssembliesToolset ;
101102
102103 static Tester ( )
103104 {
@@ -119,6 +120,7 @@ static Tester()
119120
120121 roslynToolset = new RoslynToolset ( ) ;
121122 vswhereToolset = new VsWhereToolset ( ) ;
123+ RefAssembliesToolset = new RefAssembliesToolset ( ) ;
122124 }
123125
124126 internal static async Task Initialize ( )
@@ -129,6 +131,9 @@ internal static async Task Initialize()
129131 await roslynToolset . Fetch ( roslynLatestVersion ) . ConfigureAwait ( false ) ;
130132
131133 await vswhereToolset . Fetch ( ) . ConfigureAwait ( false ) ;
134+ await RefAssembliesToolset . Fetch ( "5.0.0" , sourcePath : "ref/net5.0" ) . ConfigureAwait ( false ) ;
135+ await RefAssembliesToolset . Fetch ( "10.0.0-preview.4.25258.110" , sourcePath : "ref/net10.0" ) . ConfigureAwait ( false ) ;
136+
132137
133138#if DEBUG
134139 await BuildTestRunner ( "win-x86" , "Debug" ) . ConfigureAwait ( false ) ;
@@ -275,21 +280,14 @@ private static string ReplacePrivImplDetails(string il)
275280 return Regex . Replace ( il , @"'<PrivateImplementationDetails>\{[0-9A-F-]+\}'" , "'<PrivateImplementationDetails>'" ) ;
276281 }
277282
278- static readonly string coreRefAsmPath = new DotNetCorePathFinder ( TargetFrameworkIdentifier . NET ,
279- new Version ( 10 , 0 ) , "Microsoft.NETCore.App" )
280- . GetReferenceAssemblyPath ( ".NETCoreApp,Version=v10.0" ) ;
281-
282- public static readonly string RefAsmPath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . ProgramFilesX86 ) ,
283- @"Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2" ) ;
284-
285283 static readonly string [ ] defaultReferences = new [ ] {
286284 "System.dll" ,
287285 "System.Core.dll" ,
288286 "System.Xml.dll" ,
289287 "Microsoft.CSharp.dll"
290288 } ;
291289
292- static readonly string [ ] coreDefaultReferences = new [ ]
290+ static readonly string [ ] core220DefaultReferences = new [ ]
293291 {
294292 "netstandard.dll" ,
295293 "mscorlib.dll" ,
@@ -302,9 +300,12 @@ private static string ReplacePrivImplDetails(string il)
302300 "System.Linq.Queryable.dll" ,
303301 "System.IO.FileSystem.Watcher.dll" ,
304302 "System.Memory.dll" ,
303+ "System.Private.CoreLib.dll" ,
304+ "System.Private.Xml.dll" ,
305305 "System.Threading.dll" ,
306306 "System.Threading.Thread.dll" ,
307307 "System.Runtime.dll" ,
308+ "System.Runtime.Extensions.dll" ,
308309 "System.Runtime.InteropServices.dll" ,
309310 "System.Xml.dll" ,
310311 "System.Xml.ReaderWriter.dll" ,
@@ -313,19 +314,45 @@ private static string ReplacePrivImplDetails(string il)
313314 "Microsoft.VisualBasic.dll" ,
314315 } ;
315316
316- const string targetFrameworkAttributeSnippet = @"
317-
318- [assembly: System.Runtime.Versioning.TargetFramework("".NETCoreApp,Version=v10.0"", FrameworkDisplayName = """")]
319-
320- " ;
317+ static readonly string [ ] coreDefaultReferences = new [ ]
318+ {
319+ "netstandard.dll" ,
320+ "mscorlib.dll" ,
321+ "System.dll" ,
322+ "System.Collections.dll" ,
323+ "System.Console.dll" ,
324+ "System.Core.dll" ,
325+ "System.Linq.dll" ,
326+ "System.Linq.Expressions.dll" ,
327+ "System.Linq.Queryable.dll" ,
328+ "System.IO.FileSystem.Watcher.dll" ,
329+ "System.Memory.dll" ,
330+ "System.Threading.dll" ,
331+ "System.Threading.Thread.dll" ,
332+ "System.Runtime.dll" ,
333+ "System.Runtime.InteropServices.dll" ,
334+ "System.Xml.dll" ,
335+ "System.Xml.ReaderWriter.dll" ,
336+ "System.ValueTuple.dll" ,
337+ "Microsoft.CSharp.dll" ,
338+ "Microsoft.VisualBasic.dll" ,
339+ } ;
321340
322- static readonly Lazy < string > targetFrameworkAttributeSnippetFile = new Lazy < string > ( GetTargetFrameworkAttributeSnippetFile ) ;
341+ static readonly Dictionary < string , Lazy < string > > targetFrameworkAttributeSnippetFiles = new ( ) {
342+ { ".NETCoreApp,Version=v10.0" , new Lazy < string > ( ( ) => GetTargetFrameworkAttributeSnippetFile ( ".NETCoreApp,Version=v10.0" ) ) } ,
343+ { ".NETCoreApp,Version=v5.0" , new Lazy < string > ( ( ) => GetTargetFrameworkAttributeSnippetFile ( ".NETCoreApp,Version=v5.0" ) ) } ,
344+ { ".NETCoreApp,Version=v2.2" , new Lazy < string > ( ( ) => GetTargetFrameworkAttributeSnippetFile ( ".NETCoreApp,Version=v2.2" ) ) } ,
345+ } ;
323346
324- static string GetTargetFrameworkAttributeSnippetFile ( )
347+ static string GetTargetFrameworkAttributeSnippetFile ( string targetFrameworkMoniker )
325348 {
326349 // Note: this leaks a temporary file, we're not attempting to delete it, because it is only one.
327350 var tempFile = Path . GetTempFileName ( ) ;
328- File . WriteAllText ( tempFile , targetFrameworkAttributeSnippet ) ;
351+ File . WriteAllText ( tempFile , $@ "
352+
353+ [assembly: System.Runtime.Versioning.TargetFramework(""{ targetFrameworkMoniker } "")]
354+
355+ " ) ;
329356 return tempFile ;
330357 }
331358
@@ -452,10 +479,6 @@ public static async Task<CompilerResults> CompileCSharp(string sourceFileName, C
452479 }
453480 bool targetNet40 = ( flags & CompilerOptions . TargetNet40 ) != 0 ;
454481 bool useRoslyn = ( flags & CompilerOptions . UseRoslynMask ) != 0 ;
455- if ( useRoslyn && ! targetNet40 )
456- {
457- sourceFileNames . Add ( targetFrameworkAttributeSnippetFile . Value ) ;
458- }
459482
460483 if ( targetNet40 )
461484 {
@@ -469,35 +492,42 @@ public static async Task<CompilerResults> CompileCSharp(string sourceFileName, C
469492 CompilerResults results = new CompilerResults ( ) ;
470493 results . PathToAssembly = outputFileName ;
471494
472- var ( roslynVersion , languageVersion ) = ( flags & CompilerOptions . UseRoslynMask ) switch {
473- 0 => ( "legacy" , "5" ) ,
474- CompilerOptions . UseRoslyn1_3_2 => ( "1.3.2" , "6" ) ,
475- CompilerOptions . UseRoslyn2_10_0 => ( "2.10.0" , "latest" ) ,
476- CompilerOptions . UseRoslyn3_11_0 => ( "3.11.0" , "latest" ) ,
477- _ => ( roslynLatestVersion , flags . HasFlag ( CompilerOptions . Preview ) ? "preview" : "latest" )
495+ var ( roslynVersion , languageVersion , targetFramework ) = ( flags & CompilerOptions . UseRoslynMask ) switch {
496+ 0 => ( "legacy" , "5" , targetNet40 ? null : ".NETCoreApp,Version=v10.0" ) ,
497+ CompilerOptions . UseRoslyn1_3_2 => ( "1.3.2" , "6" , null ) ,
498+ CompilerOptions . UseRoslyn2_10_0 => ( "2.10.0" , "latest" , targetNet40 ? null : ".NETCoreApp,Version=v2.2" ) ,
499+ CompilerOptions . UseRoslyn3_11_0 => ( "3.11.0" , "latest" , targetNet40 ? null : ".NETCoreApp,Version=v5.0" ) ,
500+ _ => ( roslynLatestVersion , flags . HasFlag ( CompilerOptions . Preview ) ? "preview" : "latest" , targetNet40 ? null : ".NETCoreApp,Version=v10.0" )
478501 } ;
479502
480503 var cscPath = roslynToolset . GetCSharpCompiler ( roslynVersion ) ;
481504
482- string libPath ;
505+ string libPath , refAsmPath ;
483506 IEnumerable < string > references ;
484- if ( useRoslyn && ! targetNet40 )
507+ if ( useRoslyn && targetFramework != null )
485508 {
486- libPath = "\" " + coreRefAsmPath + "\" " ;
487- references = coreDefaultReferences . Select ( r => "-r:\" " + Path . Combine ( coreRefAsmPath , r ) + "\" " ) ;
509+ refAsmPath = RefAssembliesToolset . GetPath ( targetFramework ) ;
510+ if ( targetFramework == ".NETCoreApp,Version=v2.2" )
511+ references = core220DefaultReferences ;
512+ else
513+ references = coreDefaultReferences ;
514+ libPath = "\" " + refAsmPath + "\" " ;
515+ references = references . Select ( r => "-r:\" " + Path . Combine ( refAsmPath , r ) + "\" " ) ;
516+ sourceFileNames . Add ( targetFrameworkAttributeSnippetFiles [ targetFramework ] . Value ) ;
488517 }
489518 else
490519 {
491- libPath = "\" " + RefAsmPath + "\" ,\" " + Path . Combine ( RefAsmPath , "Facades" ) + "\" " ;
492- references = defaultReferences . Select ( r => "-r:\" " + Path . Combine ( RefAsmPath , r ) + "\" " ) ;
520+ refAsmPath = RefAssembliesToolset . GetPath ( "legacy" ) ;
521+ libPath = "\" " + refAsmPath + "\" " ;
522+ references = defaultReferences . Select ( r => "-r:\" " + Path . Combine ( refAsmPath , r ) + "\" " ) ;
493523 }
494524 if ( flags . HasFlag ( CompilerOptions . ReferenceVisualBasic ) )
495525 {
496- references = references . Concat ( new [ ] { "-r:\" Microsoft.VisualBasic.dll\" " } ) ;
526+ references = references . Concat ( new [ ] { "-r:\" " + Path . Combine ( refAsmPath , " Microsoft.VisualBasic.dll" ) + " \" " } ) ;
497527 }
498528 if ( useRoslyn && ! targetNet40 && flags . HasFlag ( CompilerOptions . ReferenceUnsafe ) )
499529 {
500- references = references . Concat ( new [ ] { "-r:\" System.Runtime.CompilerServices.Unsafe.dll\" " } ) ;
530+ references = references . Concat ( new [ ] { "-r:\" " + Path . Combine ( refAsmPath , " System.Runtime.CompilerServices.Unsafe.dll" ) + " \" " } ) ;
501531 }
502532 string otherOptions = $ "-nologo -noconfig " +
503533 $ "-langversion:{ languageVersion } " +
@@ -674,7 +704,7 @@ public static void CompileCSharpWithPdb(string assemblyName, Dictionary<string,
674704 }
675705
676706 var compilation = CSharpCompilation . Create ( Path . GetFileNameWithoutExtension ( assemblyName ) ,
677- syntaxTrees , coreDefaultReferences . Select ( r => MetadataReference . CreateFromFile ( Path . Combine ( coreRefAsmPath , r ) ) ) ,
707+ syntaxTrees , coreDefaultReferences . Select ( r => MetadataReference . CreateFromFile ( Path . Combine ( RefAssembliesToolset . GetPath ( ".NETCoreApp,Version=v10.0" ) , r ) ) ) ,
678708 new CSharpCompilationOptions (
679709 OutputKind . DynamicallyLinkedLibrary ,
680710 platform : Platform . AnyCpu ,
@@ -756,7 +786,7 @@ public static Task<string> DecompileCSharp(string assemblyFileName, DecompilerSe
756786 string targetFramework = module . Metadata . DetectTargetFrameworkId ( ) ;
757787 var resolver = new UniversalAssemblyResolver ( assemblyFileName , false ,
758788 targetFramework , null , PEStreamOptions . PrefetchMetadata ) ;
759- resolver . AddSearchDirectory ( targetFramework . Contains ( ".NETFramework" ) ? RefAsmPath : coreRefAsmPath ) ;
789+ resolver . AddSearchDirectory ( RefAssembliesToolset . GetPath ( targetFramework ) ) ;
760790 var typeSystem = new DecompilerTypeSystem ( module , resolver , settings ) ;
761791 CSharpDecompiler decompiler = new CSharpDecompiler ( typeSystem , settings ) ;
762792 decompiler . AstTransforms . Insert ( 0 , new RemoveEmbeddedAttributes ( ) ) ;
0 commit comments