Browse Source

WholeProjectDecompiler: Add support for .NET portable projects.

pull/863/head
Siegfried Pammer 8 years ago
parent
commit
43d696ab28
  1. 32
      ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs

32
ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs

@ -93,6 +93,12 @@ namespace ICSharpCode.Decompiler.CSharp @@ -93,6 +93,12 @@ namespace ICSharpCode.Decompiler.CSharp
files.AddRange(WriteResourceFilesInProject(moduleDefinition));
WriteProjectFile(projectFileWriter, files, moduleDefinition);
}
enum LanguageTargets
{
None,
Portable
}
#region WriteProjectFile
void WriteProjectFile(TextWriter writer, IEnumerable<Tuple<string, string>> files, ModuleDefinition module)
@ -134,10 +140,20 @@ namespace ICSharpCode.Decompiler.CSharp @@ -134,10 +140,20 @@ namespace ICSharpCode.Decompiler.CSharp
w.WriteElementString("AssemblyName", module.Assembly.Name.Name);
bool useTargetFrameworkAttribute = false;
LanguageTargets languageTargets = LanguageTargets.None;
var targetFrameworkAttribute = module.Assembly.CustomAttributes.FirstOrDefault(a => a.AttributeType.FullName == "System.Runtime.Versioning.TargetFrameworkAttribute");
if (targetFrameworkAttribute != null && targetFrameworkAttribute.ConstructorArguments.Any()) {
string frameworkName = (string)targetFrameworkAttribute.ConstructorArguments[0].Value;
string[] frameworkParts = frameworkName.Split(',');
string frameworkIdentifier = frameworkParts.FirstOrDefault(a => !a.StartsWith("Version=", StringComparison.OrdinalIgnoreCase) && !a.StartsWith("Profile=", StringComparison.OrdinalIgnoreCase));
if (frameworkIdentifier != null) {
w.WriteElementString("TargetFrameworkIdentifier", frameworkIdentifier);
switch (frameworkIdentifier) {
case ".NETPortable":
languageTargets = LanguageTargets.Portable;
break;
}
}
string frameworkVersion = frameworkParts.FirstOrDefault(a => a.StartsWith("Version=", StringComparison.OrdinalIgnoreCase));
if (frameworkVersion != null) {
w.WriteElementString("TargetFrameworkVersion", frameworkVersion.Substring("Version=".Length));
@ -216,10 +232,18 @@ namespace ICSharpCode.Decompiler.CSharp @@ -216,10 +232,18 @@ namespace ICSharpCode.Decompiler.CSharp
}
w.WriteEndElement();
}
w.WriteStartElement("Import");
w.WriteAttributeString("Project", "$(MSBuildToolsPath)\\Microsoft.CSharp.targets");
w.WriteEndElement();
switch (languageTargets) {
case LanguageTargets.Portable:
w.WriteStartElement("Import");
w.WriteAttributeString("Project", "$(MSBuildExtensionsPath32)\\Microsoft\\Portable\\$(TargetFrameworkVersion)\\Microsoft.Portable.CSharp.targets");
w.WriteEndElement();
break;
default:
w.WriteStartElement("Import");
w.WriteAttributeString("Project", "$(MSBuildToolsPath)\\Microsoft.CSharp.targets");
w.WriteEndElement();
break;
}
w.WriteEndDocument();
}

Loading…
Cancel
Save