# HG changeset patch # User sl # Date 1408740510 -7200 # Node ID 86aad774b532337f58039e2d36b5b26501a10d7d # Parent a9048f35097565ba7b7ac1147c6ac7701edbc200 Client now supports text alignment through our new TextField. diff -r a9048f350975 -r 86aad774b532 Client/App.config --- a/Client/App.config Fri Aug 22 10:55:34 2014 +0200 +++ b/Client/App.config Fri Aug 22 22:48:30 2014 +0200 @@ -1,6 +1,6 @@ - + - + - \ No newline at end of file + diff -r a9048f350975 -r 86aad774b532 Client/Client.cs --- a/Client/Client.cs Fri Aug 22 10:55:34 2014 +0200 +++ b/Client/Client.cs Fri Aug 22 22:48:30 2014 +0200 @@ -70,14 +70,14 @@ Channel.SetName(aClientName); } - public void SetText(int aLineIndex, string aText) + public void SetText(TextField aTextField) { - Channel.SetText(aLineIndex, aText); + Channel.SetText(aTextField); } - public void SetTexts(System.Collections.Generic.IList aTexts) + public void SetTexts(System.Collections.Generic.IList aTextFields) { - Channel.SetTexts(aTexts); + Channel.SetTexts(aTextFields); } public int ClientCount() diff -r a9048f350975 -r 86aad774b532 Client/MainForm.Designer.cs --- a/Client/MainForm.Designer.cs Fri Aug 22 10:55:34 2014 +0200 +++ b/Client/MainForm.Designer.cs Fri Aug 22 22:48:30 2014 +0200 @@ -31,11 +31,15 @@ this.buttonSetText = new System.Windows.Forms.Button(); this.textBoxTop = new System.Windows.Forms.TextBox(); this.textBoxBottom = new System.Windows.Forms.TextBox(); + this.buttonAlignRight = new System.Windows.Forms.Button(); + this.buttonAlignCenter = new System.Windows.Forms.Button(); + this.buttonAlignLeft = new System.Windows.Forms.Button(); + this.buttonSetTopText = new System.Windows.Forms.Button(); this.SuspendLayout(); // // buttonSetText // - this.buttonSetText.Location = new System.Drawing.Point(12, 132); + this.buttonSetText.Location = new System.Drawing.Point(13, 132); this.buttonSetText.Name = "buttonSetText"; this.buttonSetText.Size = new System.Drawing.Size(75, 23); this.buttonSetText.TabIndex = 0; @@ -57,11 +61,55 @@ this.textBoxBottom.Size = new System.Drawing.Size(419, 20); this.textBoxBottom.TabIndex = 2; // + // buttonAlignRight + // + this.buttonAlignRight.Location = new System.Drawing.Point(176, 160); + this.buttonAlignRight.Name = "buttonAlignRight"; + this.buttonAlignRight.Size = new System.Drawing.Size(75, 23); + this.buttonAlignRight.TabIndex = 23; + this.buttonAlignRight.Text = "Align Right"; + this.buttonAlignRight.UseVisualStyleBackColor = true; + this.buttonAlignRight.Click += new System.EventHandler(this.buttonAlignRight_Click); + // + // buttonAlignCenter + // + this.buttonAlignCenter.Location = new System.Drawing.Point(94, 161); + this.buttonAlignCenter.Name = "buttonAlignCenter"; + this.buttonAlignCenter.Size = new System.Drawing.Size(75, 23); + this.buttonAlignCenter.TabIndex = 22; + this.buttonAlignCenter.Text = "Align Center"; + this.buttonAlignCenter.UseVisualStyleBackColor = true; + this.buttonAlignCenter.Click += new System.EventHandler(this.buttonAlignCenter_Click); + // + // buttonAlignLeft + // + this.buttonAlignLeft.Location = new System.Drawing.Point(12, 161); + this.buttonAlignLeft.Name = "buttonAlignLeft"; + this.buttonAlignLeft.Size = new System.Drawing.Size(75, 23); + this.buttonAlignLeft.TabIndex = 21; + this.buttonAlignLeft.Text = "Align Left"; + this.buttonAlignLeft.UseVisualStyleBackColor = true; + this.buttonAlignLeft.Click += new System.EventHandler(this.buttonAlignLeft_Click); + // + // buttonSetTopText + // + this.buttonSetTopText.Location = new System.Drawing.Point(94, 132); + this.buttonSetTopText.Name = "buttonSetTopText"; + this.buttonSetTopText.Size = new System.Drawing.Size(75, 23); + this.buttonSetTopText.TabIndex = 24; + this.buttonSetTopText.Text = "Set Top Text"; + this.buttonSetTopText.UseVisualStyleBackColor = true; + this.buttonSetTopText.Click += new System.EventHandler(this.buttonSetTopText_Click); + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(443, 252); + this.Controls.Add(this.buttonSetTopText); + this.Controls.Add(this.buttonAlignRight); + this.Controls.Add(this.buttonAlignCenter); + this.Controls.Add(this.buttonAlignLeft); this.Controls.Add(this.textBoxBottom); this.Controls.Add(this.textBoxTop); this.Controls.Add(this.buttonSetText); @@ -79,6 +127,10 @@ private System.Windows.Forms.Button buttonSetText; private System.Windows.Forms.TextBox textBoxTop; private System.Windows.Forms.TextBox textBoxBottom; + private System.Windows.Forms.Button buttonAlignRight; + private System.Windows.Forms.Button buttonAlignCenter; + private System.Windows.Forms.Button buttonAlignLeft; + private System.Windows.Forms.Button buttonSetTopText; } } diff -r a9048f350975 -r 86aad774b532 Client/MainForm.cs --- a/Client/MainForm.cs Fri Aug 22 10:55:34 2014 +0200 +++ b/Client/MainForm.cs Fri Aug 22 22:48:30 2014 +0200 @@ -10,6 +10,7 @@ using System.ServiceModel; using System.ServiceModel.Channels; using System.Diagnostics; +using SharpDisplayInterface; namespace SharpDisplayClient @@ -18,18 +19,16 @@ { Client iClient; Callback iCallback; + ContentAlignment Alignment; + TextField iTextFieldTop; public MainForm() { InitializeComponent(); + Alignment = ContentAlignment.MiddleLeft; + iTextFieldTop = new TextField(0); } - private void buttonSetText_Click(object sender, EventArgs e) - { - //iClient.SetText(0,"Top"); - //iClient.SetText(1, "Bottom"); - iClient.SetTexts(new string[] { textBoxTop.Text, textBoxBottom.Text }); - } private void MainForm_Load(object sender, EventArgs e) { @@ -110,5 +109,46 @@ { return (iClient != null && iClient.State == CommunicationState.Opened); } + + private void buttonAlignLeft_Click(object sender, EventArgs e) + { + Alignment = ContentAlignment.MiddleLeft; + textBoxTop.TextAlign = HorizontalAlignment.Left; + textBoxBottom.TextAlign = HorizontalAlignment.Left; + } + + private void buttonAlignCenter_Click(object sender, EventArgs e) + { + Alignment = ContentAlignment.MiddleCenter; + textBoxTop.TextAlign = HorizontalAlignment.Center; + textBoxBottom.TextAlign = HorizontalAlignment.Center; + } + + private void buttonAlignRight_Click(object sender, EventArgs e) + { + Alignment = ContentAlignment.MiddleRight; + textBoxTop.TextAlign = HorizontalAlignment.Right; + textBoxBottom.TextAlign = HorizontalAlignment.Right; + } + + private void buttonSetTopText_Click(object sender, EventArgs e) + { + //TextField top = new TextField(0, textBoxTop.Text, ContentAlignment.MiddleLeft); + iTextFieldTop.Text = textBoxTop.Text; + iClient.SetText(iTextFieldTop); + } + + private void buttonSetText_Click(object sender, EventArgs e) + { + //iClient.SetText(0,"Top"); + //iClient.SetText(1, "Bottom"); + //TextField top = new TextField(0, textBoxTop.Text, ContentAlignment.MiddleLeft); + + iClient.SetTexts(new TextField[] + { + new TextField(0, textBoxTop.Text, Alignment), + new TextField(1, textBoxBottom.Text, Alignment) + }); + } } } diff -r a9048f350975 -r 86aad774b532 Client/Properties/Resources.Designer.cs --- a/Client/Properties/Resources.Designer.cs Fri Aug 22 10:55:34 2014 +0200 +++ b/Client/Properties/Resources.Designer.cs Fri Aug 22 22:48:30 2014 +0200 @@ -8,10 +8,10 @@ // //------------------------------------------------------------------------------ -namespace SharpDisplayClient.Properties -{ - - +namespace SharpDisplayClient.Properties { + using System; + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -22,48 +22,40 @@ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - + internal class Resources { + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { + internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SharpDisplayClient.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { + internal static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } diff -r a9048f350975 -r 86aad774b532 Client/Properties/Settings.Designer.cs --- a/Client/Properties/Settings.Designer.cs Fri Aug 22 10:55:34 2014 +0200 +++ b/Client/Properties/Settings.Designer.cs Fri Aug 22 22:48:30 2014 +0200 @@ -8,21 +8,17 @@ // //------------------------------------------------------------------------------ -namespace SharpDisplayClient.Properties -{ - - +namespace SharpDisplayClient.Properties { + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { + + public static Settings Default { + get { return defaultInstance; } } diff -r a9048f350975 -r 86aad774b532 Client/SharpDisplayClient.csproj --- a/Client/SharpDisplayClient.csproj Fri Aug 22 10:55:34 2014 +0200 +++ b/Client/SharpDisplayClient.csproj Fri Aug 22 22:48:30 2014 +0200 @@ -11,6 +11,7 @@ SharpDisplayClient v4.5 512 + AnyCPU @@ -21,6 +22,7 @@ DEBUG;TRACE prompt 4 + false AnyCPU @@ -30,6 +32,27 @@ TRACE prompt 4 + false + + + true + ..\..\bin\MiniDisplay\Debug\ + DEBUG;TRACE + full + x86 + prompt + MinimumRecommendedRules.ruleset + false + + + bin\x86\Release\ + TRACE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + false @@ -65,6 +88,7 @@ True Resources.resx + True SettingsSingleFileGenerator diff -r a9048f350975 -r 86aad774b532 Interface/Interface.cs --- a/Interface/Interface.cs Fri Aug 22 10:55:34 2014 +0200 +++ b/Interface/Interface.cs Fri Aug 22 22:48:30 2014 +0200 @@ -5,11 +5,40 @@ using System.Threading.Tasks; using System.ServiceModel; using System.Collections; +using System.Drawing; +using System.Runtime.Serialization; namespace SharpDisplayInterface { - + [DataContract] + public class TextField + { + public TextField() + { + Index = 0; + Text = ""; + Alignment = ContentAlignment.MiddleLeft; + } + + public TextField(int aIndex, string aText = "", ContentAlignment aAlignment = ContentAlignment.MiddleLeft) + { + Index = aIndex; + Text = aText; + Alignment = aAlignment; + } + + [DataMember] + public int Index { get; set; } + + [DataMember] + public string Text { get; set; } + + [DataMember] + public ContentAlignment Alignment { get; set; } + } + + [ServiceContract( CallbackContract = typeof(IDisplayServiceCallback), SessionMode = SessionMode.Required)] public interface IDisplayService @@ -28,19 +57,16 @@ /// Put the given text in the given field on your display. /// Fields are often just lines of text. /// - /// - /// + /// [OperationContract(IsOneWay = true)] - void SetText(int aFieldIndex, string aText); + void SetText(TextField aTextField); /// /// Allows a client to set multiple text fields at once. - /// First text in the list is set into field index 0. - /// Last text in the list is set into field index N-1. /// /// [OperationContract(IsOneWay = true)] - void SetTexts(System.Collections.Generic.IList aTexts); + void SetTexts(System.Collections.Generic.IList aTextFields); /// /// Provides the number of clients currently connected diff -r a9048f350975 -r 86aad774b532 Interface/SharpDisplayInterface.csproj --- a/Interface/SharpDisplayInterface.csproj Fri Aug 22 10:55:34 2014 +0200 +++ b/Interface/SharpDisplayInterface.csproj Fri Aug 22 22:48:30 2014 +0200 @@ -11,6 +11,7 @@ SharpDisplayInterface v4.5 512 + true @@ -20,6 +21,7 @@ DEBUG;TRACE prompt 4 + false pdbonly @@ -28,10 +30,33 @@ TRACE prompt 4 + false + + + true + ..\..\bin\MiniDisplay\Debug\ + DEBUG;TRACE + full + x86 + prompt + MinimumRecommendedRules.ruleset + false + + + bin\x86\Release\ + TRACE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + false + + diff -r a9048f350975 -r 86aad774b532 Server/App.config --- a/Server/App.config Fri Aug 22 10:55:34 2014 +0200 +++ b/Server/App.config Fri Aug 22 22:48:30 2014 +0200 @@ -1,12 +1,12 @@ - + - -
+ +
- + @@ -27,4 +27,4 @@ - \ No newline at end of file + diff -r a9048f350975 -r 86aad774b532 Server/MainForm.cs --- a/Server/MainForm.cs Fri Aug 22 10:55:34 2014 +0200 +++ b/Server/MainForm.cs Fri Aug 22 22:48:30 2014 +0200 @@ -479,8 +479,8 @@ //Delegates are used for our thread safe method public delegate void AddClientDelegate(string aSessionId, IDisplayServiceCallback aCallback); public delegate void RemoveClientDelegate(string aSessionId); - public delegate void SetTextDelegate(string SessionId, int aLineIndex, string aText); - public delegate void SetTextsDelegate(string SessionId, System.Collections.Generic.IList aTexts); + public delegate void SetTextDelegate(string SessionId, TextField aTextField); + public delegate void SetTextsDelegate(string SessionId, System.Collections.Generic.IList aTextFields); public delegate void SetClientNameDelegate(string aSessionId, string aName); @@ -546,13 +546,13 @@ ///
/// /// - public void SetTextThreadSafe(string aSessionId, int aLineIndex, string aText) + public void SetTextThreadSafe(string aSessionId, TextField aTextField) { if (this.InvokeRequired) { //Not in the proper thread, invoke ourselves SetTextDelegate d = new SetTextDelegate(SetTextThreadSafe); - this.Invoke(d, new object[] { aSessionId, aLineIndex, aText }); + this.Invoke(d, new object[] { aSessionId, aTextField }); } else { @@ -560,21 +560,24 @@ if (client != null) { //Make sure all our texts are in place - while (client.Texts.Count < (aLineIndex + 1)) + while (client.Texts.Count < (aTextField.Index + 1)) { - client.Texts.Add(""); + //Add a text field with proper index + client.Texts.Add(new TextField(client.Texts.Count)); } - client.Texts[aLineIndex] = aText; + client.Texts[aTextField.Index] = aTextField; //We are in the proper thread //Only support two lines for now - if (aLineIndex == 0) + if (aTextField.Index == 0) { - marqueeLabelTop.Text = aText; + marqueeLabelTop.Text = aTextField.Text; + marqueeLabelTop.TextAlign = aTextField.Alignment; } - else if (aLineIndex == 1) + else if (aTextField.Index == 1) { - marqueeLabelBottom.Text = aText; + marqueeLabelBottom.Text = aTextField.Text; + marqueeLabelBottom.TextAlign = aTextField.Alignment; } @@ -587,44 +590,46 @@ /// /// /// - public void SetTextsThreadSafe(string aSessionId, System.Collections.Generic.IList aTexts) + public void SetTextsThreadSafe(string aSessionId, System.Collections.Generic.IList aTextFields) { if (this.InvokeRequired) { //Not in the proper thread, invoke ourselves SetTextsDelegate d = new SetTextsDelegate(SetTextsThreadSafe); - this.Invoke(d, new object[] { aSessionId, aTexts }); + this.Invoke(d, new object[] { aSessionId, aTextFields }); } else { + //We are in the proper thread ClientData client = iClients[aSessionId]; if (client != null) { - //Populate our client with the given texts + //Populate our client with the given text fields int j = 0; - foreach (string text in aTexts) + foreach (TextField textField in aTextFields) { if (client.Texts.Count < (j + 1)) { - client.Texts.Add(text); + client.Texts.Add(textField); } else { - client.Texts[j]=text; + client.Texts[j] = textField; } j++; - } - //We are in the proper thread + } //Only support two lines for now - for (int i = 0; i < aTexts.Count; i++) + for (int i = 0; i < aTextFields.Count; i++) { - if (i == 0) + if (aTextFields[i].Index == 0) { - marqueeLabelTop.Text = aTexts[i]; + marqueeLabelTop.Text = aTextFields[i].Text; + marqueeLabelTop.TextAlign = aTextFields[i].Alignment; } - else if (i == 1) + else if (aTextFields[i].Index == 1) { - marqueeLabelBottom.Text = aTexts[i]; + marqueeLabelBottom.Text = aTextFields[i].Text; + marqueeLabelBottom.TextAlign = aTextFields[i].Alignment; } } @@ -714,9 +719,9 @@ TreeNode textsRoot = new TreeNode("Text"); node.Nodes.Add(textsRoot); //For each text add a new entry - foreach (string text in aClient.Texts) + foreach (TextField field in aClient.Texts) { - textsRoot.Nodes.Add(new TreeNode(text)); + textsRoot.Nodes.Add(new TreeNode(field.Text)); } } @@ -790,13 +795,13 @@ { SessionId = aSessionId; Name = ""; - Texts = new List(); + Texts = new List(); Callback = aCallback; } public string SessionId { get; set; } public string Name { get; set; } - public List Texts { get; set; } + public List Texts { get; set; } public IDisplayServiceCallback Callback { get; set; } } } diff -r a9048f350975 -r 86aad774b532 Server/Properties/Resources.Designer.cs --- a/Server/Properties/Resources.Designer.cs Fri Aug 22 10:55:34 2014 +0200 +++ b/Server/Properties/Resources.Designer.cs Fri Aug 22 22:48:30 2014 +0200 @@ -1,17 +1,17 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.18063 +// Runtime Version:4.0.30319.18444 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ -namespace SharpDisplayManager.Properties -{ - - +namespace SharpDisplayManager.Properties { + using System; + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -22,48 +22,40 @@ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - + internal class Resources { + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { + internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SharpDisplayManager.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { + internal static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } diff -r a9048f350975 -r 86aad774b532 Server/Servers.cs --- a/Server/Servers.cs Fri Aug 22 10:55:34 2014 +0200 +++ b/Server/Servers.cs Fri Aug 22 22:48:30 2014 +0200 @@ -40,15 +40,15 @@ } //From IDisplayService - public void SetTexts(System.Collections.Generic.IList aTexts) + public void SetTexts(System.Collections.Generic.IList aTextFields) { - Program.iMainForm.SetTextsThreadSafe(SessionId, aTexts); + Program.iMainForm.SetTextsThreadSafe(SessionId, aTextFields); } // - public void SetText(int aLineIndex, string aText) + public void SetText(TextField aTextField) { - Program.iMainForm.SetTextThreadSafe(SessionId, aLineIndex, aText); + Program.iMainForm.SetTextThreadSafe(SessionId, aTextField); } // diff -r a9048f350975 -r 86aad774b532 Server/SharpDisplayManager.csproj --- a/Server/SharpDisplayManager.csproj Fri Aug 22 10:55:34 2014 +0200 +++ b/Server/SharpDisplayManager.csproj Fri Aug 22 22:48:30 2014 +0200 @@ -11,6 +11,22 @@ SharpDisplayManager v4.5 512 + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true AnyCPU @@ -21,6 +37,7 @@ DEBUG;TRACE prompt 4 + false AnyCPU @@ -30,6 +47,27 @@ TRACE prompt 4 + false + + + true + ..\..\bin\MiniDisplay\Debug\ + DEBUG;TRACE + full + x86 + prompt + MinimumRecommendedRules.ruleset + false + + + bin\x86\Release\ + TRACE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + false @@ -75,6 +113,7 @@ True Resources.resx + True SettingsSingleFileGenerator @@ -99,6 +138,28 @@ SharpDisplayInterface + + + False + Microsoft .NET Framework 4 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 4.5 + true + +