|
|
|
@ -17,6 +17,7 @@
@@ -17,6 +17,7 @@
|
|
|
|
|
// DEALINGS IN THE SOFTWARE.
|
|
|
|
|
|
|
|
|
|
using System; |
|
|
|
|
using System.Collections.Generic; |
|
|
|
|
using System.Linq; |
|
|
|
|
using System.Reflection.PortableExecutable; |
|
|
|
|
|
|
|
|
@ -58,7 +59,6 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
@@ -58,7 +59,6 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
|
|
|
|
|
|
|
|
|
|
case TargetRuntime.Net_2_0: |
|
|
|
|
versionNumber = 200; |
|
|
|
|
// TODO: Detect when .NET 3.0/3.5 is required
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
@ -133,5 +133,131 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
@@ -133,5 +133,131 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
|
|
|
|
|
return architecture.ToString(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static HashSet<string> dotNet30Assemblies = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { |
|
|
|
|
// System
|
|
|
|
|
"System.IdentityModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.IdentityModel.Selectors, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.IO.Log, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", |
|
|
|
|
"System.Printing, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"System.Runtime.Serialization, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.ServiceModel.Install, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.ServiceModel.WasHosting, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.Speech, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"System.Workflow.Activities, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"System.Workflow.ComponentModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
|
|
|
|
|
// WPF
|
|
|
|
|
"PresentationBuildTasks, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"PresentationCFFRasterizer, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"PresentationFramework.Classic, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"PresentationFramework.Luna, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"PresentationFramework.Royale, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"PresentationUI, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"ReachFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
|
|
|
|
|
// UIAutomation
|
|
|
|
|
"WindowsFormsIntegration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"UIAutomationClient, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"UIAutomationClientsideProviders, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"UIAutomationProvider, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"UIAutomationTypes, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
|
|
|
|
|
// WCF
|
|
|
|
|
"Microsoft.Transactions.Bridge, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", |
|
|
|
|
"Microsoft.Transactions.Bridge.Dtc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static HashSet<string> dotNet35Assemblies = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { |
|
|
|
|
// System
|
|
|
|
|
"System.AddIn, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.AddIn.Contract, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", |
|
|
|
|
"System.ComponentModel.DataAnnotations, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.Data.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.Data.Entity.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.Data.Services, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.Data.Services.Client, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.Data.Services.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.DirectoryServices.AccountManagement, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.Management.Instrumentation, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.Net, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", |
|
|
|
|
"System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"System.Web.DynamicData, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"System.Web.DynamicData.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"System.Web.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.Web.Entity.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"System.Web.Extensions.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"System.Windows.Presentation, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
"System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", |
|
|
|
|
"System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", |
|
|
|
|
|
|
|
|
|
// MSBuild
|
|
|
|
|
"Microsoft.Build.Conversion.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", |
|
|
|
|
"Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", |
|
|
|
|
"Microsoft.Build.Framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", |
|
|
|
|
"Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", |
|
|
|
|
"Microsoft.Build.Utilities.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", |
|
|
|
|
"Microsoft.Data.Entity.Build.Tasks, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets exact <see cref="TargetFramework"/> if <see cref="PEFile.GetRuntime"/> is <see cref="TargetRuntime.Net_2_0"/>
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static TargetFramework DetectTargetFrameworkNET20(PEFile module, IAssemblyResolver assemblyResolver, TargetFramework targetFramework) |
|
|
|
|
{ |
|
|
|
|
var resolvedAssemblies = new HashSet<string>(); |
|
|
|
|
int version = 200; |
|
|
|
|
GetFrameworkVersionNET20(module, assemblyResolver, resolvedAssemblies, ref version); |
|
|
|
|
return new TargetFramework(targetFramework.Identifier, version, targetFramework.Profile); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void GetFrameworkVersionNET20(PEFile module, IAssemblyResolver assemblyResolver, HashSet<string> resolvedAssemblies, ref int version) |
|
|
|
|
{ |
|
|
|
|
foreach (var r in module.Metadata.AssemblyReferences) |
|
|
|
|
{ |
|
|
|
|
var reference = new AssemblyReference(module, r); |
|
|
|
|
if (!resolvedAssemblies.Add(reference.FullName)) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
if (dotNet30Assemblies.Contains(reference.FullName)) |
|
|
|
|
{ |
|
|
|
|
version = 300; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
else if (dotNet35Assemblies.Contains(reference.FullName)) |
|
|
|
|
{ |
|
|
|
|
version = 350; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
PEFile resolvedReference; |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
resolvedReference = assemblyResolver.Resolve(reference); |
|
|
|
|
} |
|
|
|
|
catch (AssemblyResolutionException) |
|
|
|
|
{ |
|
|
|
|
resolvedReference = null; |
|
|
|
|
} |
|
|
|
|
if (resolvedReference == null) |
|
|
|
|
continue; |
|
|
|
|
resolvedAssemblies.Add(resolvedReference.FullName); |
|
|
|
|
GetFrameworkVersionNET20(resolvedReference, assemblyResolver, resolvedAssemblies, ref version); |
|
|
|
|
if (version == 350) |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|