diff --git a/data/resources/StringResources.resx b/data/resources/StringResources.resx
index 49d65c8075..9c4b48eb3a 100644
--- a/data/resources/StringResources.resx
+++ b/data/resources/StringResources.resx
@@ -8377,4 +8377,67 @@ Press Esc to cancel this operation.
Press "Alt" to enter Container
+
+ Assembly Info
+
+
+ Assembly version:
+
+
+ Company:
+
+
+ Copyright:
+
+
+ Description:
+
+
+ File version:
+
+
+ GUID:
+
+
+ Make assembly COM-visible
+
+
+ Neutral language:
+
+
+ Product:
+
+
+ Title:
+
+
+ Trademark:
+
+
+ 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
+
+
+ New GUID
+
+
+ One of the assembly info values is incorrect.
+
+
+ None
+
\ No newline at end of file
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin
index 785b7fcd74..11db4687c6 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin
@@ -115,6 +115,9 @@
+
diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
index f566fed43b..c6b907cca1 100644
--- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
+++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
@@ -297,6 +297,13 @@
OutputWindowOptionsPanel.xamlCode
+
+
+ AssemblyInfoPanel.xaml
+
+
+
+ TaskViewResources.xaml
@@ -904,6 +911,10 @@
+
+ MSBuild:Compile
+ Designer
+
@@ -933,6 +944,10 @@
ICSharpCode.NRefactory.CecilFalse
+
+ {53dca265-3c3c-42f9-b647-f72ba678122b}
+ ICSharpCode.NRefactory.CSharp
+ {DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}ICSharpCode.NRefactory.Xml
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
new file mode 100644
index 0000000000..a1cd915acf
--- /dev/null
+++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfo.cs
@@ -0,0 +1,60 @@
+// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+
+namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
+{
+ ///
+ /// Assembly info parameters model
+ ///
+ public class AssemblyInfo
+ {
+ public string Title { get; set; }
+
+ public string Description { get; set; }
+
+ public string Company { get; set; }
+
+ public string Product { get; set; }
+
+ public string Copyright { get; set; }
+
+ public string Trademark { get; set; }
+
+ public string DefaultAlias { get; set; }
+
+ public Version AssemblyVersion { 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
new file mode 100644
index 0000000000..209fc08f7a
--- /dev/null
+++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoPanel.xaml
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoPanel.xaml.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoPanel.xaml.cs
new file mode 100644
index 0000000000..4919491147
--- /dev/null
+++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoPanel.xaml.cs
@@ -0,0 +1,120 @@
+// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+using System.Linq;
+using System.Windows;
+using System.Windows.Controls;
+using ICSharpCode.Core;
+using ICSharpCode.SharpDevelop.Project;
+
+namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
+{
+ ///
+ /// Interaction logic for AssemblyInfo.xaml
+ ///
+ public partial class AssemblyInfoPanel
+ {
+ private AssemblyInfo assemblyInfo;
+
+ public AssemblyInfoPanel()
+ {
+ InitializeComponent();
+ }
+
+ protected override void Load(MSBuildBasedProject project, string configuration, string platform)
+ {
+ var assemblyInfoFileName = GetAssemblyInfoFileName(project);
+
+ if (string.IsNullOrEmpty(assemblyInfoFileName))
+ {
+ assemblyInfo = new AssemblyInfo();
+ MessageService.ShowError("${res:Dialog.ProjectOptions.AssemblyInfo.AssemblyInfoNotFound}");
+ }
+ else
+ {
+ var assemblyInfoProvider = new AssemblyInfoProvider();
+ assemblyInfo = assemblyInfoProvider.ReadAssemblyInfo(assemblyInfoFileName);
+ }
+
+ var assemblyInfoViewModel = new AssemblyInfoViewModel(assemblyInfo);
+ assemblyInfoViewModel.PropertyChanged += OnAssemblyInfoChanged;
+ DataContext = assemblyInfoViewModel;
+
+ base.Load(project, configuration, platform);
+ }
+
+ protected override bool Save(MSBuildBasedProject project, string configuration, string platform)
+ {
+ if (!CheckForValidationErrors())
+ {
+ return false;
+ }
+
+ var assemblyInfoFileName = GetAssemblyInfoFileName(project);
+ if (!string.IsNullOrEmpty(assemblyInfoFileName))
+ {
+ if (assemblyInfo != null)
+ {
+ var assemblyInfoProvider = new AssemblyInfoProvider();
+ assemblyInfoProvider.MergeAssemblyInfo(assemblyInfo, assemblyInfoFileName);
+ }
+ }
+ else
+ {
+ MessageService.ShowError("${res:Dialog.ProjectOptions.AssemblyInfo.AssemblyInfoNotFound}");
+ }
+
+ return base.Save(project, configuration, platform);
+ }
+
+ private string GetAssemblyInfoFileName(MSBuildBasedProject project)
+ {
+ var assemblyInfoProjectItem = project.Items
+ .FirstOrDefault(projectItem => projectItem.FileName.GetFileNameWithoutExtension() == "AssemblyInfo");
+
+ if (assemblyInfoProjectItem == null || assemblyInfoProjectItem.FileName == null)
+ return null;
+
+ return assemblyInfoProjectItem.FileName.ToString();
+ }
+
+ private void OnAssemblyInfoChanged(object sender, EventArgs e)
+ {
+ this.IsDirty = true;
+ }
+
+ private bool CheckForValidationErrors()
+ {
+ var wrongControl = RootGrid.Children.OfType().FirstOrDefault(Validation.GetHasError);
+ if (wrongControl != null)
+ {
+ MessageService.ShowError("${res:Dialog.ProjectOptions.AssemblyInfo.IncorrectValue}");
+ wrongControl.Focus();
+
+ var textBox = wrongControl as TextBox;
+ if (textBox != null)
+ textBox.SelectAll();
+
+ return false;
+ }
+
+ return true;
+ }
+ }
+}
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
new file mode 100644
index 0000000000..7e646bd577
--- /dev/null
+++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoProvider.cs
@@ -0,0 +1,420 @@
+// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using ICSharpCode.NRefactory;
+using ICSharpCode.NRefactory.CSharp;
+using Attribute = ICSharpCode.NRefactory.CSharp.Attribute;
+using CSharpParser = ICSharpCode.NRefactory.CSharp.CSharpParser;
+
+namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
+{
+ ///
+ /// Class for reading and writing assembly info file
+ ///
+ public class AssemblyInfoProvider
+ {
+ #region Constants
+
+ private const string Attribute = "Attribute";
+
+ private const string AssemblyTitle = "AssemblyTitle";
+ private const string AssemblyDescription = "AssemblyDescription";
+ private const string AssemblyCompany = "AssemblyCompany";
+ private const string AssemblyProduct = "AssemblyProduct";
+ private const string AssemblyCopyright = "AssemblyCopyright";
+ private const string AssemblyTrademark = "AssemblyTrademark";
+ private const string AssemblyDefaultAlias = "AssemblyDefaultAlias";
+ private const string AssemblyVersion = "AssemblyVersion";
+ private const string AssemblyFileVersion = "AssemblyFileVersion";
+ private const string AssemblyInformationalVersion = "AssemblyInformationalVersion";
+ private const string Guid = "Guid";
+ private const string NeutralResourcesLanguage = "NeutralResourcesLanguage";
+ private const string ComVisible = "ComVisible";
+ private const string ClsCompliant = "CLSCompliant";
+ private const string AssemblyFlags = "AssemblyFlags";
+
+ #endregion
+
+ ///
+ /// Read assembly info from file
+ ///
+ /// Source file name
+ /// Assembly info model
+ public AssemblyInfo ReadAssemblyInfo(string assemblyInfoFileName)
+ {
+ using (var fileStream = new FileStream(assemblyInfoFileName, FileMode.Open, FileAccess.Read))
+ {
+ return ReadAssemblyInfo(fileStream);
+ }
+ }
+
+ ///
+ /// Read assembly info from stream
+ ///
+ /// Sourcce stream
+ /// Assembly info model
+ public AssemblyInfo ReadAssemblyInfo(Stream stream)
+ {
+ var syntaxTree = ReadSyntaxTree(stream);
+
+ if (syntaxTree == null)
+ throw new Exception("Can't read assembly info syntax tree.");
+
+ var assemblyInfo = new AssemblyInfo {JitOptimization = true};
+
+ foreach (var attributeSection in syntaxTree.Children.OfType())
+ {
+ foreach (var attribute in attributeSection.Attributes)
+ {
+ var attributeType = attribute.Type as SimpleType;
+ if (attributeType == null)
+ continue;
+
+ switch (attributeType.Identifier)
+ {
+ case AssemblyTitle:
+ case AssemblyTitle + Attribute:
+ assemblyInfo.Title = GetAttributeValue(attribute);
+ break;
+ case AssemblyDescription:
+ case AssemblyDescription + Attribute:
+ assemblyInfo.Description = GetAttributeValue(attribute);
+ break;
+ case AssemblyCompany:
+ case AssemblyCompany + Attribute:
+ assemblyInfo.Company = GetAttributeValue(attribute);
+ break;
+ case AssemblyProduct:
+ case AssemblyProduct + Attribute:
+ assemblyInfo.Product = GetAttributeValue(attribute);
+ break;
+ case AssemblyCopyright:
+ case AssemblyCopyright + Attribute:
+ assemblyInfo.Copyright = GetAttributeValue(attribute);
+ break;
+ case AssemblyTrademark:
+ case AssemblyTrademark + Attribute:
+ assemblyInfo.Trademark = GetAttributeValue(attribute);
+ break;
+ case AssemblyDefaultAlias:
+ case AssemblyDefaultAlias + Attribute:
+ assemblyInfo.DefaultAlias = GetAttributeValue(attribute);
+ break;
+ case AssemblyVersion:
+ case AssemblyVersion + Attribute:
+ assemblyInfo.AssemblyVersion = GetAttributeValueAsVersion(attribute);
+ break;
+ case AssemblyFileVersion:
+ case AssemblyFileVersion + Attribute:
+ assemblyInfo.AssemblyFileVersion = GetAttributeValueAsVersion(attribute);
+ break;
+ case AssemblyInformationalVersion:
+ case AssemblyInformationalVersion + Attribute:
+ assemblyInfo.InformationalVersion = GetAttributeValueAsVersion(attribute);
+ break;
+ case Guid:
+ case Guid + Attribute:
+ assemblyInfo.Guid = GetAttributeValueAsGuid(attribute);
+ break;
+ case NeutralResourcesLanguage:
+ case NeutralResourcesLanguage + Attribute:
+ assemblyInfo.NeutralLanguage = GetAttributeValue(attribute);
+ break;
+ case ComVisible:
+ case ComVisible + Attribute:
+ assemblyInfo.ComVisible = GetAttributeValue(attribute);
+ break;
+ case ClsCompliant:
+ case ClsCompliant + Attribute:
+ assemblyInfo.ClsCompliant = GetAttributeValue(attribute);
+ break;
+ case AssemblyFlags:
+ case AssemblyFlags + Attribute:
+ var assemblyFlags = GetAssemblyFlagsFromAttribute(attribute);
+ assemblyInfo.JitOptimization = !assemblyFlags.HasFlag(AssemblyNameFlags.EnableJITcompileOptimizer);
+ assemblyInfo.JitTracking = assemblyFlags.HasFlag(AssemblyNameFlags.EnableJITcompileTracking);
+ break;
+ }
+ }
+ }
+
+ return assemblyInfo;
+ }
+
+ ///
+ /// Merge assembly info in file with the assembly info model
+ ///
+ /// Assembly info model
+ /// Source file name
+ public void MergeAssemblyInfo(AssemblyInfo assemblyInfo, string fileName)
+ {
+ string content;
+
+ using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
+ {
+ content = MergeAssemblyInfo(assemblyInfo, fileStream);
+ }
+
+ if (!string.IsNullOrEmpty(content))
+ File.WriteAllText(fileName, content);
+ }
+
+ ///
+ /// Merge assembly info from the stream with the assembly info model
+ ///
+ /// Assembly info model
+ /// Source file name
+ /// Result assembly info file content
+ public string MergeAssemblyInfo(AssemblyInfo assemblyInfo, Stream inputStream)
+ {
+ var syntaxTree = ReadSyntaxTree(inputStream);
+
+ if (syntaxTree == null)
+ throw new Exception("Can't read assembly info syntax tree.");
+
+ // Add missing namespaces
+ AddNamespaceUsingIfNotExist(syntaxTree, "System");
+ AddNamespaceUsingIfNotExist(syntaxTree, "System.Reflection");
+
+ if (assemblyInfo.NeutralLanguage != null)
+ AddNamespaceUsingIfNotExist(syntaxTree, "System.Resources");
+
+ if (assemblyInfo.Guid.HasValue || assemblyInfo.ComVisible)
+ AddNamespaceUsingIfNotExist(syntaxTree, "System.Runtime.InteropServices");
+
+ // Update assembly info attributes
+ 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, null, true);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyFileVersion, assemblyInfo.AssemblyFileVersion, null, true);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyInformationalVersion, assemblyInfo.InformationalVersion, null, true);
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, Guid, assemblyInfo.Guid, null, 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;
+
+ var flagsExpression = GetAssemblyFlagsExpression(assemblyFlags);
+
+ SetAttributeValueOrAddAttributeIfNotDefault(syntaxTree, AssemblyFlags, (int)assemblyFlags, (int)AssemblyNameFlags.PublicKey, flagsExpression);
+
+ return syntaxTree.ToString();
+ }
+
+ private SyntaxTree ReadSyntaxTree(Stream stream)
+ {
+ using (var streamReader = new StreamReader(stream))
+ {
+ var codeParser = new CSharpParser();
+ return codeParser.Parse(streamReader);
+ }
+ }
+
+ private T GetAttributeValue(Attribute attribute, T defaultValue = default(T))
+ {
+ var attributeArguments = attribute.Arguments.OfType().ToArray();
+ if (attributeArguments.Length == 1 && attributeArguments[0].Value is T)
+ return (T)attributeArguments[0].Value;
+
+ return defaultValue;
+ }
+
+ private Guid? GetAttributeValueAsGuid(Attribute attribute)
+ {
+ var attributeArguments = attribute.Arguments.OfType().ToArray();
+ if (attributeArguments.Length == 1)
+ {
+ var guidString = attributeArguments[0].Value as string;
+ if (!string.IsNullOrEmpty(guidString))
+ {
+ Guid guid;
+ if (System.Guid.TryParse(guidString, out guid))
+ {
+ return guid;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private Version GetAttributeValueAsVersion(Attribute attribute)
+ {
+ var attributeArguments = attribute.Arguments.OfType().ToArray();
+ if (attributeArguments.Length == 1)
+ {
+ var versionString = attributeArguments[0].Value as string;
+ if (!string.IsNullOrEmpty(versionString))
+ {
+ Version version;
+ if (Version.TryParse(versionString, out version))
+ return version;
+ }
+ }
+
+ return null;
+ }
+
+ private AssemblyNameFlags GetAssemblyFlagsFromAttribute(Attribute attribute)
+ {
+ if (attribute.Arguments.Count == 1)
+ return GetAssemblyFlagsFromExpression(attribute.Arguments.ElementAt(0));
+
+ return AssemblyNameFlags.PublicKey;
+ }
+
+ private AssemblyNameFlags GetAssemblyFlagsFromExpression(Expression expression)
+ {
+ if (expression == null)
+ return AssemblyNameFlags.PublicKey;
+
+ var primitiveExpression = expression as PrimitiveExpression;
+ if (primitiveExpression != null && primitiveExpression.Value is int)
+ return (AssemblyNameFlags)(int)primitiveExpression.Value;
+
+ var memberReferenceExpression = expression as MemberReferenceExpression;
+ if (memberReferenceExpression != null)
+ {
+ AssemblyNameFlags assemblyFlags;
+ if (Enum.TryParse(memberReferenceExpression.MemberName, out assemblyFlags))
+ {
+ return assemblyFlags;
+ }
+ }
+
+ var binaryExpression = expression as BinaryOperatorExpression;
+ if (binaryExpression != null && binaryExpression.Operator == BinaryOperatorType.BitwiseOr)
+ return GetAssemblyFlagsFromExpression(binaryExpression.Left) |
+ GetAssemblyFlagsFromExpression(binaryExpression.Right);
+
+ return AssemblyNameFlags.PublicKey;
+ }
+
+ private Expression GetAssemblyFlagsExpression(AssemblyNameFlags assemblyFlags)
+ {
+ var flagNames = new List();
+ var flagValues = Enum.GetValues(typeof(AssemblyNameFlags));
+
+ foreach (var flagValue in flagValues)
+ {
+ if (assemblyFlags.HasFlag((Enum)flagValue) && (int)flagValue > 0)
+ flagNames.Add(flagValue.ToString());
+ }
+
+ Expression expression = null;
+
+ while (flagNames.Count > 0)
+ {
+ var currentFlagName = flagNames[0];
+ var flagExpression = new MemberReferenceExpression(new IdentifierExpression("AssemblyNameFlags"), currentFlagName);
+
+ expression = expression == null
+ ? (Expression) flagExpression
+ : new BinaryOperatorExpression(expression, BinaryOperatorType.BitwiseOr, flagExpression);
+
+ flagNames.Remove(currentFlagName);
+ }
+
+ return expression;
+ }
+
+ private void SetAttributeValueOrAddAttributeIfNotDefault(
+ SyntaxTree syntaxTree,
+ string attributeName,
+ object value,
+ object defaultValue = null,
+ bool transformValueToString = false)
+ {
+ if (value == null)
+ return;
+
+ var attributeValue = transformValueToString ? value.ToString() : value;
+
+ SetAttributeValueOrAddAttributeIfNotDefault(
+ syntaxTree,
+ attributeName,
+ value,
+ defaultValue,
+ new PrimitiveExpression(attributeValue));
+ }
+
+ private void SetAttributeValueOrAddAttributeIfNotDefault(
+ SyntaxTree syntaxTree,
+ string attributeName,
+ object value,
+ object defaultValue,
+ Expression valueExpression)
+ {
+ if (value == null)
+ return;
+
+ var attribute = syntaxTree.Children.OfType().SelectMany(x => x.Attributes)
+ .FirstOrDefault(x => x.Type is SimpleType && ((SimpleType)x.Type).Identifier == attributeName);
+
+ if (attribute != null)
+ {
+ attribute.Arguments.Clear();
+ attribute.Arguments.Add(valueExpression);
+ }
+ else if (!value.Equals(defaultValue))
+ {
+ attribute = new Attribute { Type = new SimpleType(attributeName) };
+ attribute.Arguments.Add(valueExpression);
+
+ var attributeSection = new AttributeSection(attribute) { AttributeTarget = "assembly" };
+ syntaxTree.AddChild(attributeSection, new NRefactory.Role("Member"));
+ }
+ }
+
+ private void AddNamespaceUsingIfNotExist(SyntaxTree syntaxTree, string @namespace)
+ {
+ AstNode nodeToInsertAfter = null;
+
+ foreach (var usingDeclaration in syntaxTree.Children.OfType())
+ {
+ if (usingDeclaration.Namespace == @namespace)
+ return;
+
+ if (string.Compare(usingDeclaration.Namespace, @namespace, StringComparison.InvariantCulture) < 0)
+ nodeToInsertAfter = usingDeclaration;
+ }
+
+ if (nodeToInsertAfter != null)
+ syntaxTree.InsertChildAfter(nodeToInsertAfter, new UsingDeclaration(@namespace), new Role("Using"));
+ else if (syntaxTree.HasChildren)
+ syntaxTree.InsertChildBefore(syntaxTree.FirstChild, new UsingDeclaration(@namespace), new Role("Using"));
+ else
+ syntaxTree.AddChild(new UsingDeclaration(@namespace), new Role("Using"));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoViewModel.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoViewModel.cs
new file mode 100644
index 0000000000..2b4b8414cf
--- /dev/null
+++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/AssemblyInfoViewModel.cs
@@ -0,0 +1,161 @@
+// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Windows.Input;
+using ICSharpCode.Core;
+using ICSharpCode.SharpDevelop.Widgets;
+
+namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
+{
+ ///
+ /// View model for assembly info
+ ///
+ public class AssemblyInfoViewModel : ViewModelBase
+ {
+ private const string NONE_LANGUAGE_CODE = "NONE";
+
+ private readonly AssemblyInfo assemblyInfo;
+
+ public AssemblyInfoViewModel(AssemblyInfo assemblyInfo)
+ {
+ this.assemblyInfo = assemblyInfo;
+ NewGuidCommand = new RelayCommand(() => Guid = System.Guid.NewGuid());
+
+ var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
+
+ Languages = new Dictionary();
+ Languages.Add(
+ NONE_LANGUAGE_CODE,
+ string.Format("({0})", StringParser.Parse("${res:Dialog.ProjectOptions.AssemblyInfo.None}")));
+
+ Languages.AddRange(cultures.ToDictionary(x => x.Name, x => x.DisplayName).Distinct().OrderBy(x => x.Value));
+ }
+
+ public string Title
+ {
+ get { return assemblyInfo.Title; }
+ set { assemblyInfo.Title = value; OnPropertyChanged(); }
+ }
+
+ public string Description
+ {
+ get { return assemblyInfo.Description; }
+ set { assemblyInfo.Description = value; OnPropertyChanged(); }
+ }
+
+ public string Company
+ {
+ get { return assemblyInfo.Company; }
+ set { assemblyInfo.Company = value; OnPropertyChanged(); }
+ }
+
+ public string Product
+ {
+ get { return assemblyInfo.Product; }
+ set { assemblyInfo.Product = value; OnPropertyChanged(); }
+ }
+
+ public string Copyright
+ {
+ get { return assemblyInfo.Copyright; }
+ set { assemblyInfo.Copyright = value; OnPropertyChanged(); }
+ }
+
+ public string Trademark
+ {
+ get { return assemblyInfo.Trademark; }
+ set { assemblyInfo.Trademark = value; OnPropertyChanged(); }
+ }
+
+ public string DefaultAlias
+ {
+ get { return assemblyInfo.DefaultAlias; }
+ set { assemblyInfo.DefaultAlias = value; OnPropertyChanged(); }
+ }
+
+ public Version AssemblyVersion
+ {
+ get { return assemblyInfo.AssemblyVersion; }
+ set { assemblyInfo.AssemblyVersion = value; OnPropertyChanged(); }
+ }
+
+ public Version AssemblyFileVersion
+ {
+ get { return assemblyInfo.AssemblyFileVersion; }
+ set { assemblyInfo.AssemblyFileVersion = value; OnPropertyChanged(); }
+ }
+
+ public Version InformationalVersion
+ {
+ get { return assemblyInfo.InformationalVersion; }
+ set { assemblyInfo.InformationalVersion = value; OnPropertyChanged(); }
+ }
+
+ public Guid? Guid
+ {
+ get { return assemblyInfo.Guid; }
+ set { assemblyInfo.Guid = value; OnPropertyChanged(); }
+ }
+
+ public string NeutralLanguage
+ {
+ get
+ {
+ return assemblyInfo.NeutralLanguage ?? NONE_LANGUAGE_CODE;
+ }
+
+ set
+ {
+ assemblyInfo.NeutralLanguage = value == NONE_LANGUAGE_CODE ? null : value;
+ OnPropertyChanged();
+ }
+ }
+
+ public bool ComVisible
+ {
+ get { return assemblyInfo.ComVisible; }
+ set { assemblyInfo.ComVisible = value; OnPropertyChanged(); }
+ }
+
+ public bool ClsCompliant
+ {
+ get { return assemblyInfo.ClsCompliant; }
+ set { assemblyInfo.ClsCompliant = value; OnPropertyChanged(); }
+ }
+
+ public bool JitOptimization
+ {
+ get { return assemblyInfo.JitOptimization; }
+ set { assemblyInfo.JitOptimization = value; OnPropertyChanged(); }
+ }
+
+ public bool JitTracking
+ {
+ get { return assemblyInfo.JitTracking; }
+ set { assemblyInfo.JitTracking = value; OnPropertyChanged(); }
+ }
+
+ public ICommand NewGuidCommand { get; private set; }
+
+ public Dictionary Languages { get; private set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/VersionToStringConverter.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/VersionToStringConverter.cs
new file mode 100644
index 0000000000..153bebf4fe
--- /dev/null
+++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/AssemblyInfo/VersionToStringConverter.cs
@@ -0,0 +1,66 @@
+// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+using System.Windows;
+using System.Windows.Data;
+
+namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
+{
+ [ValueConversion(typeof(Version), typeof(string))]
+ public class VersionToStringConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ try
+ {
+ var version = value as Version;
+ if (version != null)
+ return version.ToString();
+
+ return DependencyProperty.UnsetValue;
+ }
+ catch
+ {
+ return DependencyProperty.UnsetValue;
+ }
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ try
+ {
+ var versionString = value as string;
+ if (versionString != null)
+ {
+ Version version;
+ if (Version.TryParse(versionString, out version))
+ {
+ return version;
+ }
+ }
+
+ return DependencyProperty.UnsetValue;
+ }
+ catch
+ {
+ return DependencyProperty.UnsetValue;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj
index a2b2c1dad1..c61d9534b4 100644
--- a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj
+++ b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj
@@ -5,7 +5,7 @@
AnyCPU8.0.406072.0
- {4980B743-B32F-4aba-AABD-45E2CAD3568D}
+ {4980B743-B32F-4ABA-AABD-45E2CAD3568D}ICSharpCode.SharpDevelopICSharpCode.SharpDevelop.TestsLibrary
@@ -97,6 +97,7 @@
+
diff --git a/src/Main/Base/Test/ProjectOptions/AssemblyInfoProviderTests.cs b/src/Main/Base/Test/ProjectOptions/AssemblyInfoProviderTests.cs
new file mode 100644
index 0000000000..e479f26e2e
--- /dev/null
+++ b/src/Main/Base/Test/ProjectOptions/AssemblyInfoProviderTests.cs
@@ -0,0 +1,518 @@
+// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System.IO;
+using System.Text;
+using ICSharpCode.SharpDevelop.Gui.OptionPanels;
+using NUnit.Framework;
+using System;
+
+namespace ICSharpCode.SharpDevelop.ProjectOptions
+{
+ ///
+ /// Tests for assembly info reading and writing
+ ///
+ [TestFixture]
+ public class AssemblyInfoProviderTests
+ {
+ private const string AssemblyInfoSample1 =
+@"using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle (""SharpDevelop"")]
+[assembly: AssemblyDescription (""OpenSource IDE"")]
+[assembly: AssemblyCompany (""Company"")]
+[assembly: AssemblyProduct (""Product"")]
+[assembly: AssemblyCopyright (""Copyright 2014"")]
+[assembly: AssemblyTrademark (""Trademark"")]
+[assembly: AssemblyDefaultAlias (""Alias"")]
+// This sets the default COM visibility of types in the assembly to invisible.
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.
+[assembly: ComVisible (true)]
+// The assembly version has following format :
+//
+// Major.Minor.Build.Revision
+//
+// You can specify all the values or you can use the default the Revision and
+// Build Numbers by using the '*' as shown below:
+[assembly: AssemblyVersion (""1.2.3.1"")]
+[assembly: AssemblyFileVersion (""1.2.3.2"")]
+[assembly: AssemblyInformationalVersion (""1.2.3.3"")]
+[assembly: Guid (""0c8c889f-ced2-4167-b155-2d48a99d8c72"")]
+[assembly: NeutralResourcesLanguage (""ru-RU"")]
+[assembly: AssemblyFlags (32769)]
+[assembly: CLSCompliant (true)]";
+
+ [TestCase]
+ public void ReadEmptyAssemblyInfoTest()
+ {
+ var assemblyInfoFile = string.Empty;
+
+ var assemblyInfo = ReadAssemblyInfo(assemblyInfoFile);
+
+ Assert.IsNull(assemblyInfo.Title);
+ Assert.IsNull(assemblyInfo.Description);
+ Assert.IsNull(assemblyInfo.Company);
+ Assert.IsNull(assemblyInfo.Product);
+ Assert.IsNull(assemblyInfo.Copyright);
+ Assert.IsNull(assemblyInfo.Trademark);
+ Assert.IsNull(assemblyInfo.DefaultAlias);
+ Assert.IsNull(assemblyInfo.AssemblyVersion);
+ Assert.IsNull(assemblyInfo.AssemblyFileVersion);
+ Assert.IsNull(assemblyInfo.InformationalVersion);
+ Assert.IsNull(assemblyInfo.Guid);
+ Assert.IsNull(assemblyInfo.NeutralLanguage);
+ Assert.IsFalse(assemblyInfo.ComVisible);
+ Assert.IsFalse(assemblyInfo.ClsCompliant);
+ Assert.IsTrue(assemblyInfo.JitOptimization);
+ Assert.IsFalse(assemblyInfo.JitTracking);
+ }
+
+ [TestCase]
+ public void ReadNotEmptyAssemblyInfoTest()
+ {
+ var assemblyInfoFile = AssemblyInfoSample1;
+
+ var assemblyInfo = ReadAssemblyInfo(assemblyInfoFile);
+
+ Assert.AreEqual("SharpDevelop", assemblyInfo.Title);
+ Assert.AreEqual("OpenSource IDE" , assemblyInfo.Description);
+ Assert.AreEqual("Company", assemblyInfo.Company);
+ Assert.AreEqual("Product", assemblyInfo.Product);
+ Assert.AreEqual("Copyright 2014", assemblyInfo.Copyright);
+ Assert.AreEqual("Trademark", assemblyInfo.Trademark);
+ Assert.AreEqual("Alias", assemblyInfo.DefaultAlias);
+ Assert.AreEqual(new Version(1, 2, 3, 1), assemblyInfo.AssemblyVersion);
+ Assert.AreEqual(new Version(1, 2, 3, 2), assemblyInfo.AssemblyFileVersion);
+ Assert.AreEqual(new Version(1, 2, 3, 3), assemblyInfo.InformationalVersion);
+ Assert.AreEqual(new Guid("0c8c889f-ced2-4167-b155-2d48a99d8c72"), assemblyInfo.Guid);
+ Assert.AreEqual("ru-RU", assemblyInfo.NeutralLanguage);
+ Assert.IsTrue(assemblyInfo.ComVisible);
+ Assert.IsTrue(assemblyInfo.ClsCompliant);
+ Assert.IsTrue(assemblyInfo.JitOptimization);
+ Assert.IsTrue(assemblyInfo.JitTracking);
+ }
+
+ [TestCase]
+ public void ReadAssemblyInfoWithIncorrectVersionsTest()
+ {
+ var assemblyInfoFile =
+@"using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// This sets the default COM visibility of types in the assembly to invisible.
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.
+[assembly: ComVisible (true)]
+// The assembly version has following format :
+//
+// Major.Minor.Build.Revision
+//
+// You can specify all the values or you can use the default the Revision and
+// Build Numbers by using the '*' as shown below:
+[assembly: AssemblyVersion (""Incorrect version"")]
+[assembly: AssemblyFileVersion (""Incorrect version"")]
+[assembly: AssemblyInformationalVersion (""Incorrect version"")]";
+
+ var assemblyInfo = ReadAssemblyInfo(assemblyInfoFile);
+ Assert.IsNull(assemblyInfo.AssemblyVersion);
+ Assert.IsNull(assemblyInfo.AssemblyFileVersion);
+ Assert.IsNull(assemblyInfo.InformationalVersion);
+ }
+
+ [TestCase]
+ public void ReadAssemblyInfoWithIncorrectGuidTest()
+ {
+ var assemblyInfoFile =
+@"using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// This sets the default COM visibility of types in the assembly to invisible.
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.
+[assembly: ComVisible (true)]
+[assembly: Guid (""Incorrect GUID"")]";
+
+ var assemblyInfo = ReadAssemblyInfo(assemblyInfoFile);
+
+ Assert.IsNull(assemblyInfo.Guid);
+ }
+
+ [TestCase]
+ public void ReadAssemblyInfoWithEmptyStringsTest()
+ {
+ var assemblyInfoFile =
+@"using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle ("""")]
+[assembly: AssemblyDescription ("""")]
+[assembly: AssemblyCompany ("""")]
+[assembly: AssemblyProduct ("""")]
+[assembly: AssemblyCopyright ("""")]
+[assembly: AssemblyTrademark ("""")]
+[assembly: AssemblyDefaultAlias ("""")]
+
+// This sets the default COM visibility of types in the assembly to invisible.
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.
+[assembly: ComVisible (true)]
+// The assembly version has following format :
+//
+// Major.Minor.Build.Revision
+//
+// You can specify all the values or you can use the default the Revision and
+// Build Numbers by using the '*' as shown below:
+[assembly: AssemblyVersion ("""")]
+[assembly: AssemblyFileVersion ("""")]
+[assembly: AssemblyInformationalVersion ("""")]
+[assembly: Guid ("""")]
+[assembly: NeutralResourcesLanguage ("""")]";
+
+ var assemblyInfo = ReadAssemblyInfo(assemblyInfoFile);
+
+ Assert.AreEqual("", assemblyInfo.Title);
+ Assert.AreEqual("", assemblyInfo.Description);
+ Assert.AreEqual("", assemblyInfo.Company);
+ Assert.AreEqual("", assemblyInfo.Product);
+ Assert.AreEqual("", assemblyInfo.Copyright);
+ Assert.AreEqual("", assemblyInfo.Trademark);
+ Assert.AreEqual("", assemblyInfo.DefaultAlias);
+ Assert.IsNull(assemblyInfo.AssemblyVersion);
+ Assert.IsNull(assemblyInfo.AssemblyFileVersion);
+ Assert.IsNull(assemblyInfo.InformationalVersion);
+ Assert.IsNull(assemblyInfo.Guid);
+ Assert.AreEqual("", assemblyInfo.NeutralLanguage);
+ }
+
+ [TestCase]
+ public void ReadAssemblyInfoWithFalseBooleanValuesTest()
+ {
+ var assemblyInfoFile =
+@"using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// This sets the default COM visibility of types in the assembly to invisible.
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.
+[assembly: ComVisible (false)]
+[assembly: CLSCompliant (false)]";
+
+ var assemblyInfo = ReadAssemblyInfo(assemblyInfoFile);
+
+ Assert.IsFalse(assemblyInfo.ComVisible);
+ Assert.IsFalse(assemblyInfo.ClsCompliant);
+ }
+
+ [TestCase]
+ public void ReadAssemblyInfoWithTrueBooleanValuesTest()
+ {
+ var assemblyInfoFile =
+@"using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// This sets the default COM visibility of types in the assembly to invisible.
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.
+[assembly: ComVisible (true)]
+[assembly: CLSCompliant (true)]";
+
+ var assemblyInfo = ReadAssemblyInfo(assemblyInfoFile);
+
+ Assert.IsTrue(assemblyInfo.ComVisible);
+ Assert.IsTrue(assemblyInfo.ClsCompliant);
+ }
+
+ [TestCase]
+ public void ReadAssemblyInfoWithAttributePostfixTest()
+ {
+ var assemblyInfoFile =
+@"using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitleAttribute (""SharpDevelop"")]
+[assembly: AssemblyDescriptionAttribute (""OpenSource IDE"")]
+[assembly: AssemblyCompanyAttribute (""Company"")]
+[assembly: AssemblyProductAttribute (""Product"")]
+[assembly: AssemblyCopyrightAttribute (""Copyright 2014"")]
+[assembly: AssemblyTrademarkAttribute (""Trademark"")]
+[assembly: AssemblyDefaultAliasAttribute (""Alias"")]
+// This sets the default COM visibility of types in the assembly to invisible.
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.
+[assembly: ComVisibleAttribute (true)]
+// The assembly version has following format :
+//
+// Major.Minor.Build.Revision
+//
+// You can specify all the values or you can use the default the Revision and
+// Build Numbers by using the '*' as shown below:
+[assembly: AssemblyVersionAttribute (""1.2.3.1"")]
+[assembly: AssemblyFileVersionAttribute (""1.2.3.2"")]
+[assembly: AssemblyInformationalVersionAttribute (""1.2.3.3"")]
+[assembly: GuidAttribute (""0c8c889f-ced2-4167-b155-2d48a99d8c72"")]
+[assembly: NeutralResourcesLanguageAttribute (""ru-RU"")]
+[assembly: AssemblyFlagsAttribute (32769)]
+[assembly: CLSCompliantAttribute (true)]";
+
+ var assemblyInfo = ReadAssemblyInfo(assemblyInfoFile);
+
+ Assert.AreEqual("SharpDevelop", assemblyInfo.Title);
+ Assert.AreEqual("OpenSource IDE", assemblyInfo.Description);
+ Assert.AreEqual("Company", assemblyInfo.Company);
+ Assert.AreEqual("Product", assemblyInfo.Product);
+ Assert.AreEqual("Copyright 2014", assemblyInfo.Copyright);
+ Assert.AreEqual("Trademark", assemblyInfo.Trademark);
+ Assert.AreEqual("Alias", assemblyInfo.DefaultAlias);
+ Assert.AreEqual(new Version(1, 2, 3, 1), assemblyInfo.AssemblyVersion);
+ Assert.AreEqual(new Version(1, 2, 3, 2), assemblyInfo.AssemblyFileVersion);
+ Assert.AreEqual(new Version(1, 2, 3, 3), assemblyInfo.InformationalVersion);
+ Assert.AreEqual(new Guid("0c8c889f-ced2-4167-b155-2d48a99d8c72"), assemblyInfo.Guid);
+ Assert.AreEqual("ru-RU", assemblyInfo.NeutralLanguage);
+ Assert.IsTrue(assemblyInfo.ComVisible);
+ Assert.IsTrue(assemblyInfo.ClsCompliant);
+ Assert.IsTrue(assemblyInfo.JitOptimization);
+ Assert.IsTrue(assemblyInfo.JitTracking);
+ }
+
+ [TestCase]
+ public void ReadAssemblyFlagsTests()
+ {
+ var assemblyInfo = ReadAssemblyInfo("[assembly: AssemblyFlags (32769)]");
+ Assert.IsTrue(assemblyInfo.JitOptimization);
+ Assert.IsTrue(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo("[assembly: AssemblyFlags (16385)]");
+ Assert.IsFalse(assemblyInfo.JitOptimization);
+ Assert.IsFalse(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo("[assembly: AssemblyFlags (49153)]");
+ Assert.IsFalse(assemblyInfo.JitOptimization);
+ Assert.IsTrue(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo("[assembly: AssemblyFlags (0)]");
+ Assert.IsTrue(assemblyInfo.JitOptimization);
+ Assert.IsFalse(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo(
+ "[assembly: AssemblyFlags(AssemblyNameFlags.EnableJITcompileTracking)]");
+ Assert.IsTrue(assemblyInfo.JitOptimization);
+ Assert.IsTrue(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo(
+ "[assembly: AssemblyFlags(AssemblyNameFlags.EnableJITcompileOptimizer)]");
+ Assert.IsFalse(assemblyInfo.JitOptimization);
+ Assert.IsFalse(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo(
+ "[assembly: AssemblyFlags()]");
+ Assert.IsTrue(assemblyInfo.JitOptimization);
+ Assert.IsFalse(assemblyInfo.JitTracking);
+
+ assemblyInfo = ReadAssemblyInfo(
+ "[assembly: AssemblyFlags(AssemblyNameFlags.EnableJITcompileOptimizer | AssemblyNameFlags.EnableJITcompileTracking)]");
+ Assert.IsFalse(assemblyInfo.JitOptimization);
+ Assert.IsTrue(assemblyInfo.JitTracking);
+ }
+
+ [TestCase]
+ public void WriteAssemblyFlagsTests()
+ {
+ var assemblyInfo = new AssemblyInfo { JitOptimization = false, JitTracking = true };
+ Assert.AreEqual(
+@"using System;
+using System.Reflection;
+
+[assembly: AssemblyFlags (AssemblyNameFlags.PublicKey | AssemblyNameFlags.EnableJITcompileOptimizer | AssemblyNameFlags.EnableJITcompileTracking)]
+",
+ WriteAssemblyInfoFile(assemblyInfo, string.Empty));
+
+ assemblyInfo = new AssemblyInfo { JitOptimization = true, JitTracking = true };
+ Assert.AreEqual(
+@"using System;
+using System.Reflection;
+
+[assembly: AssemblyFlags (AssemblyNameFlags.PublicKey | AssemblyNameFlags.EnableJITcompileTracking)]
+",
+ WriteAssemblyInfoFile(assemblyInfo, string.Empty));
+
+ assemblyInfo = new AssemblyInfo { JitOptimization = true, JitTracking = false };
+ Assert.AreEqual("using System;\r\nusing System.Reflection;\r\n\r\n", WriteAssemblyInfoFile(assemblyInfo, string.Empty));
+
+ assemblyInfo = new AssemblyInfo { JitOptimization = false, JitTracking = false };
+ Assert.AreEqual(
+@"using System;
+using System.Reflection;
+
+[assembly: AssemblyFlags (AssemblyNameFlags.PublicKey | AssemblyNameFlags.EnableJITcompileOptimizer)]
+",
+ WriteAssemblyInfoFile(assemblyInfo, string.Empty));
+ }
+
+ [TestCase]
+ public void WriteDefaultAssemblyInfoToEmptyAssemblyInfoFileTest()
+ {
+ var assemblyInfoFile = "using System;";
+ var assemblyInfo = new AssemblyInfo { JitOptimization = true };
+ var result = WriteAssemblyInfoFile(assemblyInfo, assemblyInfoFile);
+
+ Assert.AreEqual("using System;\r\nusing System.Reflection;\r\n\r\n", result);
+ }
+
+ [TestCase]
+ public void WriteNotDefaultAssemblyInfoToEmptyAssemblyInfoFileTest()
+ {
+ var assemblyInfoFile = "using System.Reflection;";
+
+ var assemblyInfo = new AssemblyInfo
+ {
+ Title = "SharpDevelop",
+ Description = "OpenSource IDE",
+ Company = "Company",
+ Product = "Product",
+ Copyright = "Copyright 2014",
+ Trademark = "Trademark",
+ DefaultAlias = "Alias",
+ AssemblyVersion = new Version(1, 2, 3, 4),
+ AssemblyFileVersion = new Version(1, 2, 3, 4),
+ InformationalVersion = new Version(1, 2, 3, 4),
+ Guid = new Guid("0c8c889f-ced2-4167-b155-2d48a99d8c72"),
+ NeutralLanguage = "ru-RU",
+ ComVisible = true,
+ ClsCompliant = true,
+ JitOptimization = true,
+ JitTracking = true
+ };
+
+ var result = WriteAssemblyInfoFile(assemblyInfo, assemblyInfoFile);
+
+ Assert.AreEqual(
+@"using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+
+[assembly: AssemblyTitle (""SharpDevelop"")]
+[assembly: AssemblyDescription (""OpenSource IDE"")]
+[assembly: AssemblyCompany (""Company"")]
+[assembly: AssemblyProduct (""Product"")]
+[assembly: AssemblyCopyright (""Copyright 2014"")]
+[assembly: AssemblyTrademark (""Trademark"")]
+[assembly: AssemblyDefaultAlias (""Alias"")]
+[assembly: AssemblyVersion (""1.2.3.4"")]
+[assembly: AssemblyFileVersion (""1.2.3.4"")]
+[assembly: AssemblyInformationalVersion (""1.2.3.4"")]
+[assembly: Guid (""0c8c889f-ced2-4167-b155-2d48a99d8c72"")]
+[assembly: NeutralResourcesLanguage (""ru-RU"")]
+[assembly: ComVisible (true)]
+[assembly: CLSCompliant (true)]
+[assembly: AssemblyFlags (AssemblyNameFlags.PublicKey | AssemblyNameFlags.EnableJITcompileTracking)]
+", result);
+ }
+
+ [TestCase]
+ public void WriteNotDefaultAssemblyInfoToNotEmptyAssemblyInfoFileTest()
+ {
+ var assemblyInfoFile = AssemblyInfoSample1;
+
+ var assemblyInfo = new AssemblyInfo
+ {
+ Title = "SharpDevelop-changed",
+ Description = "OpenSource IDE-changed",
+ Company = "Company-changed",
+ Product = "Product-changed",
+ Copyright = "Copyright 2014-changed",
+ Trademark = "Trademark-changed",
+ DefaultAlias = "Alias-changed",
+ AssemblyVersion = new Version(4, 3, 2, 1),
+ AssemblyFileVersion = new Version(4, 3, 2, 1),
+ InformationalVersion = new Version(4, 3, 2, 1),
+ Guid = new Guid("dc8c889f-ced2-4167-b155-2d48a99d8c72"),
+ NeutralLanguage = "en-US",
+ ComVisible = false,
+ ClsCompliant = false,
+ JitOptimization = false,
+ JitTracking = false
+ };
+
+ var result = WriteAssemblyInfoFile(assemblyInfo, assemblyInfoFile);
+
+ Assert.AreEqual(
+@"using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle (""SharpDevelop-changed"")]
+[assembly: AssemblyDescription (""OpenSource IDE-changed"")]
+[assembly: AssemblyCompany (""Company-changed"")]
+[assembly: AssemblyProduct (""Product-changed"")]
+[assembly: AssemblyCopyright (""Copyright 2014-changed"")]
+[assembly: AssemblyTrademark (""Trademark-changed"")]
+[assembly: AssemblyDefaultAlias (""Alias-changed"")]
+// This sets the default COM visibility of types in the assembly to invisible.
+// If you need to expose a type to COM, use [ComVisible(true)] on that type.
+[assembly: ComVisible (false)]
+// The assembly version has following format :
+//
+// Major.Minor.Build.Revision
+//
+// You can specify all the values or you can use the default the Revision and
+// Build Numbers by using the '*' as shown below:
+[assembly: AssemblyVersion (""4.3.2.1"")]
+[assembly: AssemblyFileVersion (""4.3.2.1"")]
+[assembly: AssemblyInformationalVersion (""4.3.2.1"")]
+[assembly: Guid (""dc8c889f-ced2-4167-b155-2d48a99d8c72"")]
+[assembly: NeutralResourcesLanguage (""en-US"")]
+[assembly: AssemblyFlags (AssemblyNameFlags.PublicKey | AssemblyNameFlags.EnableJITcompileOptimizer)]
+[assembly: CLSCompliant (false)]
+", result);
+ }
+
+ private AssemblyInfo ReadAssemblyInfo(string assemblyInfoFile)
+ {
+ using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(assemblyInfoFile)))
+ {
+ var assemblyInfoProvider = new AssemblyInfoProvider();
+ return assemblyInfoProvider.ReadAssemblyInfo(stream);
+ }
+ }
+
+ private string WriteAssemblyInfoFile(AssemblyInfo assemblyInfo, string sourceFile)
+ {
+ using (var inputStream = new MemoryStream(Encoding.UTF8.GetBytes(sourceFile)))
+ {
+ var assemblyInfoProvider = new AssemblyInfoProvider();
+ return assemblyInfoProvider.MergeAssemblyInfo(assemblyInfo, inputStream);
+ }
+ }
+ }
+}