diff --git a/data/resources/StringResources.resx b/data/resources/StringResources.resx index 8776ce0573..8791f0f8f9 100644 --- a/data/resources/StringResources.resx +++ b/data/resources/StringResources.resx @@ -8416,4 +8416,19 @@ Press Esc to cancel this operation. Assembly info file was not found. Please ensure that the project contains assembly info file. + + CLS compliant + + + Default alias: + + + Informational version: + + + JIT optimization + + + JIT tracking + \ No newline at end of file diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfo.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfo.cs index fb4759f036..b23f10e950 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfo.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfo.cs @@ -34,14 +34,24 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels public string Trademark { get; set; } + public string DefaultAlias { get; set; } + public Version AssemblyVersion { get; set; } - public Version FileVersion { get; set; } + public Version AssemblyFileVersion { get; set; } + + public Version InformationalVersion { get; set; } public Guid Guid { get; set; } public string NeutralLanguage { get; set; } public bool ComVisible { get; set; } + + public bool ClsCompliant { get; set; } + + public bool JitOptimization { get; set; } + + public bool JitTracking { get; set; } } } \ No newline at end of file diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoPanel.xaml b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoPanel.xaml index 66506cb3c0..494e38dafa 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoPanel.xaml +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoPanel.xaml @@ -6,7 +6,8 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:core="http://icsharpcode.net/sharpdevelop/core" xmlns:optionPanels="clr-namespace:ICSharpCode.SharpDevelop.Gui.OptionPanels" - mc:Ignorable="d"> + mc:Ignorable="d" + d:DataContext="{d:DesignInstance Type={x:Type optionPanels:AssemblyInfo}}"> @@ -44,29 +45,60 @@ + + + + + + diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoProvider.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoProvider.cs index ebbcab3392..38e1956510 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoProvider.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoProvider.cs @@ -19,6 +19,7 @@ using System; using System.IO; using System.Linq; +using System.Reflection; using ICSharpCode.NRefactory.CSharp; using Mono.CSharp; using Attribute = ICSharpCode.NRefactory.CSharp.Attribute; @@ -37,6 +38,8 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels var assemblyInfo = new AssemblyInfo(); + assemblyInfo.JitOptimization = true; + foreach (var attributeSection in syntaxTree.Children.OfType()) { foreach (var attribute in attributeSection.Attributes) @@ -48,41 +51,53 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels switch (attributeType.Identifier) { case "AssemblyTitle": - assemblyInfo.Title = GetAttributeValueAsString(attribute); + assemblyInfo.Title = GetAttributeValue(attribute); break; case "AssemblyDescription": - assemblyInfo.Description = GetAttributeValueAsString(attribute); + assemblyInfo.Description = GetAttributeValue(attribute); break; case "AssemblyConfigurtation": break; case "AssemblyCompany": - assemblyInfo.Company = GetAttributeValueAsString(attribute); + assemblyInfo.Company = GetAttributeValue(attribute); break; case "AssemblyProduct": - assemblyInfo.Product = GetAttributeValueAsString(attribute); + assemblyInfo.Product = GetAttributeValue(attribute); break; case "AssemblyCopyright": - assemblyInfo.Copyright = GetAttributeValueAsString(attribute); + assemblyInfo.Copyright = GetAttributeValue(attribute); break; case "AssemblyTrademark": - assemblyInfo.Trademark = GetAttributeValueAsString(attribute); + assemblyInfo.Trademark = GetAttributeValue(attribute); break; - case "AssemblyCulture": + case "AssemblyDefaultAlias": + assemblyInfo.DefaultAlias = GetAttributeValue(attribute); break; - case "ComVisible": - assemblyInfo.ComVisible = GetAttributeValueAsBool(attribute); + case "AssemblyVersion": + assemblyInfo.AssemblyVersion = GetAttributeValueAsVersion(attribute); + break; + case "AssemblyFileVersion": + assemblyInfo.AssemblyFileVersion = GetAttributeValueAsVersion(attribute); + break; + case "AssemblyInformationalVersion": + assemblyInfo.InformationalVersion = GetAttributeValueAsVersion(attribute); break; case "Guid": assemblyInfo.Guid = GetAttributeValueAsGuid(attribute); break; - case "AssemblyVersion": - assemblyInfo.AssemblyVersion = GetAttributeValueAsVersion(attribute); + case "NeutralResourcesLanguage": + assemblyInfo.NeutralLanguage = GetAttributeValue(attribute); break; - case "AssemblyFileVersion": - assemblyInfo.FileVersion = GetAttributeValueAsVersion(attribute); + case "ComVisible": + assemblyInfo.ComVisible = GetAttributeValue(attribute); break; - case "NeutralResourcesLanguageAttribute": - assemblyInfo.NeutralLanguage = GetAttributeValueAsString(attribute); + case "CLSCompliant": + assemblyInfo.ClsCompliant = GetAttributeValue(attribute); + break; + case "AssemblyFlags": + var assemblyFlags = (AssemblyNameFlags)GetAttributeValue(attribute, (int)AssemblyNameFlags.PublicKey); + assemblyInfo.JitOptimization = !assemblyFlags.HasFlag(AssemblyNameFlags.EnableJITcompileOptimizer); + assemblyInfo.JitTracking = assemblyFlags.HasFlag(AssemblyNameFlags.EnableJITcompileTracking); break; } } @@ -98,17 +113,28 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels if (syntaxTree == null) throw new Exception("Can't read assembly info syntax tree."); - SetAttributeValueOrAddAttribute(syntaxTree, "AssemblyTitle", assemblyInfo.Title); - SetAttributeValueOrAddAttribute(syntaxTree, "AssemblyDescription", assemblyInfo.Description); - SetAttributeValueOrAddAttribute(syntaxTree, "AssemblyCompany", assemblyInfo.Company); - SetAttributeValueOrAddAttribute(syntaxTree, "AssemblyProduct", assemblyInfo.Product); - SetAttributeValueOrAddAttribute(syntaxTree, "AssemblyCopyright", assemblyInfo.Copyright); - SetAttributeValueOrAddAttribute(syntaxTree, "AssemblyTrademark", assemblyInfo.Trademark); - SetAttributeValueOrAddAttribute(syntaxTree, "ComVisible", assemblyInfo.ComVisible); - SetAttributeValueOrAddAttribute(syntaxTree, "Guid", assemblyInfo.Guid.ToString()); - SetAttributeValueOrAddAttribute(syntaxTree, "AssemblyVersion", assemblyInfo.AssemblyVersion.ToString()); - SetAttributeValueOrAddAttribute(syntaxTree, "AssemblyFileVersion", assemblyInfo.FileVersion.ToString()); - SetAttributeValueOrAddAttribute(syntaxTree, "NeutralResourcesLanguageAttribute", assemblyInfo.NeutralLanguage); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyTitle", assemblyInfo.Title); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyDescription", assemblyInfo.Description); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyCompany", assemblyInfo.Company); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyProduct", assemblyInfo.Product); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyCopyright", assemblyInfo.Copyright); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyTrademark", assemblyInfo.Trademark); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyDefaultAlias", assemblyInfo.DefaultAlias); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyVersion", assemblyInfo.AssemblyVersion, new Version(), true); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyFileVersion", assemblyInfo.AssemblyFileVersion, new Version(), true); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyInformationalVersion", assemblyInfo.InformationalVersion, new Version(), true); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "Guid", assemblyInfo.Guid, Guid.Empty, true); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "NeutralResourcesLanguage", assemblyInfo.NeutralLanguage); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "ComVisible", assemblyInfo.ComVisible, false); + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "CLSCompliant", assemblyInfo.ClsCompliant, false); + + AssemblyNameFlags assemblyFlags = AssemblyNameFlags.PublicKey; + if (!assemblyInfo.JitOptimization) + assemblyFlags = assemblyFlags | AssemblyNameFlags.EnableJITcompileOptimizer; + if (assemblyInfo.JitTracking) + assemblyFlags = assemblyFlags | AssemblyNameFlags.EnableJITcompileTracking; + + SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, "AssemblyFlags", (int)assemblyFlags, (int)AssemblyNameFlags.PublicKey); WriteSyntaxTree(syntaxTree, fileName); } @@ -131,22 +157,13 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels File.WriteAllText(fileName, syntaxTree.ToString()); } - private string GetAttributeValueAsString(Attribute attribute) - { - var attributeArguments = attribute.Arguments.OfType().ToArray(); - if (attributeArguments.Length == 1) - return attributeArguments[0].Value as string; - - return string.Empty; - } - - private bool GetAttributeValueAsBool(Attribute attribute) + private T GetAttributeValue(Attribute attribute, T defaultValue = default(T)) { var attributeArguments = attribute.Arguments.OfType().ToArray(); - if (attributeArguments.Length == 1) - return (bool)attributeArguments[0].Value; + if (attributeArguments.Length == 1 && attributeArguments[0].Value is T) + return (T)attributeArguments[0].Value; - return false; + return defaultValue; } private Guid GetAttributeValueAsGuid(Attribute attribute) @@ -164,34 +181,36 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels if (attributeArguments.Length == 1) { var versionString = attributeArguments[0].Value as string; - var versionParts = versionString.Split('.'); - if (versionParts.Length == 4) + if (!string.IsNullOrEmpty(versionString)) { - return new Version( - int.Parse(versionParts[0]), - int.Parse(versionParts[1]), - int.Parse(versionParts[2]), - int.Parse(versionParts[3])); + Version version; + if (Version.TryParse(versionString, out version)) + return version; } } return null; } - private void SetAttributeValueOrAddAttribute(SyntaxTree syntaxTree, string attributeName, object value) + private void SetAttributeValueOrAddAttributeIfNotDefault(SyntaxTree syntaxTree, string attributeName, object value, object defaultValue = null, bool transformValueToString = false) { + if (value == null) + return; + var attribute = syntaxTree.Children.OfType().SelectMany(x => x.Attributes) .FirstOrDefault(x => x.Type is SimpleType && ((SimpleType)x.Type).Identifier == attributeName); + var attributeValue = transformValueToString ? value.ToString() : value; + if (attribute != null) { attribute.Arguments.Clear(); - attribute.Arguments.Add(new PrimitiveExpression(value)); + attribute.Arguments.Add(new PrimitiveExpression(attributeValue)); } - else + else if (value != null && !value.Equals(defaultValue)) { attribute = new Attribute() { Type = new SimpleType(attributeName) }; - attribute.Arguments.Add(new PrimitiveExpression(value)); + attribute.Arguments.Add(new PrimitiveExpression(attributeValue)); var attributeSection = new AttributeSection(attribute) { AttributeTarget = "assembly" }; syntaxTree.AddChild(attributeSection, new NRefactory.Role("Member"));