aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2020-10-25 16:58:42 +0200
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2020-10-25 16:58:42 +0200
commitd530d39d7ed9b05e3e233adc62dceba2fd17e1fe (patch)
tree2e042288fdeedd12e3ca0ee331743ebc115eb4b2
parentadaddad79352c156303e9178a6f172a18af50cd2 (diff)
downloadTango-d530d39d7ed9b05e3e233adc62dceba2fd17e1fe.tar.gz
Tango-d530d39d7ed9b05e3e233adc62dceba2fd17e1fe.zip
Improved extension methods support on procedures.
Drastically reduces procedure designer loading time. DataStore proto support fully working and tested.
-rw-r--r--Software/DB/PPC/Tango.mdfbin75497472 -> 75497472 bytes
-rw-r--r--Software/DB/PPC/Tango_log.ldfbin53673984 -> 53673984 bytes
-rw-r--r--Software/DB/Tango.mdfbin75497472 -> 75497472 bytes
-rw-r--r--Software/DB/Tango_log.ldfbin22675456 -> 22675456 bytes
-rw-r--r--Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs5
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs11
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs25
-rw-r--r--Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs1
-rw-r--r--Software/Visual_Studio/Tango.Core/ExtensionMethods/TypeExtensions.cs74
-rw-r--r--Software/Visual_Studio/Tango.Core/Tango.Core.csproj4
-rw-r--r--Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj1
-rw-r--r--Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs35
-rw-r--r--Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs6
-rw-r--r--Software/Visual_Studio/Tango.DataStore/ExtensionMethods.cs16
-rw-r--r--Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj2
-rw-r--r--Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs53
-rw-r--r--Software/Visual_Studio/Tango.PMR/ExtensionMethods/IMessageExtensions.cs27
-rw-r--r--Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj3
18 files changed, 219 insertions, 44 deletions
diff --git a/Software/DB/PPC/Tango.mdf b/Software/DB/PPC/Tango.mdf
index 7e41561c2..82f79b115 100644
--- a/Software/DB/PPC/Tango.mdf
+++ b/Software/DB/PPC/Tango.mdf
Binary files differ
diff --git a/Software/DB/PPC/Tango_log.ldf b/Software/DB/PPC/Tango_log.ldf
index 9d05c6dbf..3e094bf75 100644
--- a/Software/DB/PPC/Tango_log.ldf
+++ b/Software/DB/PPC/Tango_log.ldf
Binary files differ
diff --git a/Software/DB/Tango.mdf b/Software/DB/Tango.mdf
index dd6d320e3..f51d1ef53 100644
--- a/Software/DB/Tango.mdf
+++ b/Software/DB/Tango.mdf
Binary files differ
diff --git a/Software/DB/Tango_log.ldf b/Software/DB/Tango_log.ldf
index ee59bb247..efb7ce79e 100644
--- a/Software/DB/Tango_log.ldf
+++ b/Software/DB/Tango_log.ldf
Binary files differ
diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs
index 4cf64a688..78e2bcfb1 100644
--- a/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs
+++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/RemoteDataStoreCollection.cs
@@ -136,6 +136,11 @@ namespace Tango.FSE.UI.DataStore
public IDataStoreItem GetItem(string key, object defaultValue)
{
+ if (defaultValue is IMessage defaultValueMessage)
+ {
+ defaultValue = DataStoreProtoObject.FromMessage(defaultValueMessage);
+ }
+
var result = _machineProvider.MachineOperator.SendGenericRequest<RemoteDataStoreGetItemRequest, RemoteDataStoreGetItemResponse>(new RemoteDataStoreGetItemRequest()
{
Collection = Name,
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs
index bf0eadae1..ddc0f6cdb 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs
@@ -16,6 +16,7 @@ using Tango.PPC.Common.Connection;
using Tango.PPC.Common.ExternalBridge;
using Tango.Transport;
using Tango.Core.ExtensionMethods;
+using Newtonsoft.Json.Linq;
namespace Tango.PPC.Common.DataStore
{
@@ -59,6 +60,11 @@ namespace Tango.PPC.Common.DataStore
[ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetRequest), RequestHandlerLoggingMode.LogRequestName)]
public async Task OnRemoteDataStoreGetRequest(RemoteDataStoreGetRequest request, String token, ExternalBridgeReceiver receiver)
{
+ if (request.DefaultValue is JObject obj)
+ {
+ request.DefaultValue = DataStoreProtoObject.FromJObject(obj);
+ }
+
var item = GetManager().GetCollection(request.Collection).GetItem(request.Key, request.DefaultValue);
await receiver.SendGenericResponse(new RemoteDataStoreGetResponse()
{
@@ -70,6 +76,11 @@ namespace Tango.PPC.Common.DataStore
[ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetItemRequest), RequestHandlerLoggingMode.LogRequestName)]
public async Task OnRemoteDataStoreGetItemRequest(RemoteDataStoreGetItemRequest request, String token, ExternalBridgeReceiver receiver)
{
+ if (request.DefaultValue is JObject obj)
+ {
+ request.DefaultValue = DataStoreProtoObject.FromJObject(obj);
+ }
+
var item = GetManager().GetCollection(request.Collection).GetItem(request.Key, request.DefaultValue);
await receiver.SendGenericResponse(new RemoteDataStoreGetItemResponse()
{
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs
index f55838db3..8010dc689 100644
--- a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Intellisense/KnownType.cs
@@ -1,4 +1,5 @@
-using System;
+using Newtonsoft.Json;
+using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
@@ -43,6 +44,13 @@ namespace Tango.Scripting.Editors.Intellisense
}
public List<KnownTypeField> Fields { get; set; }
+ public static List<Assembly> ExtensionMethodsAssemblies { get; set; }
+
+ static KnownType()
+ {
+ ExtensionMethodsAssemblies = new List<Assembly>();
+ }
+
public KnownType(Type type)
{
Summary = "Loading documentation...";
@@ -131,11 +139,24 @@ namespace Tango.Scripting.Editors.Intellisense
methods.AddRange(inter.GetRuntimeMethods().Where(x => x.IsPublic && !x.IsSpecialName).ToList());
}
methods = methods.Distinct().ToList();
+
+ if (!methods.Exists(x => x.Name == "ToString"))
+ {
+ methods.Add(typeof(Object).GetMethod("ToString"));
+ }
}
//TODO: Separate extension methods!
methods.AddRange(Type.GetExtensionMethods(Type.Assembly).ToList());
+ if (Type.Namespace.StartsWith("Tango"))
+ {
+ foreach (var asm in ExtensionMethodsAssemblies.Where(x => x != Type.Assembly))
+ {
+ methods.AddRange(Type.GetExtensionMethods(asm).ToList());
+ }
+ }
+
if (typeof(IEnumerable).IsAssignableFrom(Type))
{
var linqMethods = typeof(System.Linq.Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public).ToList();
@@ -152,7 +173,7 @@ namespace Tango.Scripting.Editors.Intellisense
m.Name = method.Name;
m.ReturnType = method.ReturnType;
m.ReturnTypeFriendlyName = method.ReturnType.GetFriendlyName();
- m.IsStatic = method.IsStatic;
+ m.IsStatic = method.IsStatic && !method.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false);
if (method.IsGenericMethod)
{
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs
index 9ff78912f..e65ff671d 100644
--- a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs
+++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/ScriptEditor.cs
@@ -1808,6 +1808,7 @@ namespace Tango.Scripting.Editors
_isLoadingTypes = true;
var assemblies = ReferenceAssemblies.ToList();
+ KnownType.ExtensionMethodsAssemblies = assemblies.ToList();
var usings = _current_usings.ToList();
Thread t = new Thread(() =>
diff --git a/Software/Visual_Studio/Tango.Core/ExtensionMethods/TypeExtensions.cs b/Software/Visual_Studio/Tango.Core/ExtensionMethods/TypeExtensions.cs
index 66978ec19..44297b277 100644
--- a/Software/Visual_Studio/Tango.Core/ExtensionMethods/TypeExtensions.cs
+++ b/Software/Visual_Studio/Tango.Core/ExtensionMethods/TypeExtensions.cs
@@ -10,6 +10,19 @@ using System.Threading.Tasks;
/// </summary>
public static class TypeExtensions
{
+ private class AssemblyExtensionMethods
+ {
+ public Assembly Assembly { get; set; }
+ public List<MethodInfo> Methods { get; set; }
+
+ public AssemblyExtensionMethods()
+ {
+ Methods = new List<MethodInfo>();
+ }
+ }
+
+ private static List<AssemblyExtensionMethods> _extensionMethodsCache = new List<AssemblyExtensionMethods>();
+
/// <summary>
/// Gets all the extension methods registered in the specified assembly.
/// </summary>
@@ -18,14 +31,61 @@ public static class TypeExtensions
/// <returns></returns>
public static IEnumerable<MethodInfo> GetExtensionMethods(this Type type, Assembly extensionsAssembly)
{
- var query = from t in extensionsAssembly.GetTypes()
- where !t.IsGenericType && !t.IsNested
- from m in t.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
- where m.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false)
- where m.GetParameters()[0].ParameterType == type
- select m;
+ if (type.Name == "CalculateRequest")
+ {
+
+ }
+
+ var asmMethods = _extensionMethodsCache.FirstOrDefault(x => x.Assembly == extensionsAssembly);
+
+ if (asmMethods == null)
+ {
+ var query = from t in extensionsAssembly.GetTypes()
+ where !t.IsGenericType && !t.IsNested
+ from m in t.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
+ where m.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false)
+ select m;
+
+ asmMethods = new AssemblyExtensionMethods();
+ asmMethods.Assembly = extensionsAssembly;
+ asmMethods.Methods = query.ToList();
+ _extensionMethodsCache.Add(asmMethods);
+ }
+
+ List<MethodInfo> methods = new List<MethodInfo>();
+
+ asmMethods.Methods.Where(x => x.GetParameters()[0].ParameterType.IsAssignableFrom(type));
+
+ foreach (var method in asmMethods.Methods)
+ {
+ var parameter = method.GetParameters()[0];
+
+ if (parameter.ParameterType.IsGenericParameter)
+ {
+ var constraints = parameter.ParameterType.GetGenericParameterConstraints().ToList();
+
+ if (constraints.Count > 0)
+ {
+ if (constraints[0].IsAssignableFrom(type))
+ {
+ methods.Add(method);
+ }
+ else if (constraints[0].GetInterfaces().Any(x => x.IsAssignableFrom(type)))
+ {
+ methods.Add(method);
+ }
+ }
+ }
+ else
+ {
+ if (parameter.ParameterType.IsAssignableFrom(type))
+ {
+ methods.Add(method);
+ }
+ }
+ }
- return query;
+ return methods;
}
/// <summary>
diff --git a/Software/Visual_Studio/Tango.Core/Tango.Core.csproj b/Software/Visual_Studio/Tango.Core/Tango.Core.csproj
index 582fa9712..813a31443 100644
--- a/Software/Visual_Studio/Tango.Core/Tango.Core.csproj
+++ b/Software/Visual_Studio/Tango.Core/Tango.Core.csproj
@@ -155,7 +155,7 @@
<Compile Include="ExtensionMethods\INotifyPropertyChangedExtensions.cs" />
<Compile Include="ExtensionMethods\ObservableCollectionExtensions.cs" />
<Compile Include="ExtensionMethods\IEnumerableExtensions.cs" />
- <Compile Include="ExtensionMethods\IMessageExtensions.cs" />
+ <None Include="ExtensionMethods\IMessageExtensions.cs" />
<Compile Include="ExtensionMethods\IParameterizedExtensions.cs" />
<Compile Include="ExtensionMethods\ObjectExtensions.cs" />
<Compile Include="ExtensionMethods\ProcessExtensions.cs" />
@@ -220,7 +220,7 @@
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<ProjectExtensions>
<VisualStudio>
- <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" />
+ <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" />
</VisualStudio>
</ProjectExtensions>
<Import Project="..\packages\System.Data.SQLite.Core.1.0.108.0\build\net46\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.108.0\build\net46\System.Data.SQLite.Core.targets')" />
diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj b/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj
index 2b05d6af3..4d0d04054 100644
--- a/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj
+++ b/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj
@@ -76,7 +76,6 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
- <None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
diff --git a/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs b/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs
index 3cf24bdd0..96a905120 100644
--- a/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs
+++ b/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs
@@ -35,7 +35,11 @@ namespace Tango.DataStore
/// <exception cref="System.NotSupportedException"></exception>
public static DataType GetDataType(Type type)
{
- if (type == typeof(Int32))
+ if (type == typeof(int))
+ {
+ return DataType.Int32;
+ }
+ else if (type == typeof(Int64))
{
return DataType.Int32;
}
@@ -72,35 +76,6 @@ namespace Tango.DataStore
}
/// <summary>
- /// Gets the CLR type by specified data store data type.
- /// </summary>
- /// <param name="type">The type.</param>
- /// <returns></returns>
- /// <exception cref="System.NotSupportedException">The specified data type is not supported.</exception>
- //public static Type GetType(DataType type)
- //{
- // switch (type)
- // {
- // case DataType.Boolean:
- // return typeof(bool);
- // case DataType.Bytes:
- // return typeof(byte[]);
- // case DataType.Double:
- // return typeof(double);
- // case DataType.Float:
- // return typeof(float);
- // case DataType.Int32:
- // return typeof(Int32);
- // case DataType.String:
- // return typeof(String);
- // case DataType.Proto:
- // return typeof(DataStoreProtoObject);
- // }
-
- // throw new NotSupportedException("The specified data type is not supported.");
- //}
-
- /// <summary>
/// Formats the data store item as a string.
/// </summary>
/// <param name="item">The item.</param>
diff --git a/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs b/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs
index ec4cf1057..6661c2017 100644
--- a/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs
+++ b/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs
@@ -1,5 +1,6 @@
using Google.Protobuf;
using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
@@ -59,6 +60,11 @@ namespace Tango.DataStore
return proto;
}
+ public static DataStoreProtoObject FromJObject(JObject obj)
+ {
+ return (obj.ToObject<DataStoreProtoObject>());
+ }
+
public static DataStoreProtoObject FromPMRDataStoreItem(DataStoreItem item)
{
DataStoreProtoObject proto = new DataStoreProtoObject();
diff --git a/Software/Visual_Studio/Tango.DataStore/ExtensionMethods.cs b/Software/Visual_Studio/Tango.DataStore/ExtensionMethods.cs
new file mode 100644
index 000000000..acc381a61
--- /dev/null
+++ b/Software/Visual_Studio/Tango.DataStore/ExtensionMethods.cs
@@ -0,0 +1,16 @@
+using Google.Protobuf;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DataStore;
+
+public static class ExtensionMethods
+{
+ public static DataStoreProtoObject ToDataStoreProtoObject(IMessage message)
+ {
+ return DataStoreProtoObject.FromMessage(message);
+ }
+}
+
diff --git a/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj b/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj
index 8035af7b4..c12abe9e8 100644
--- a/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj
+++ b/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj
@@ -54,6 +54,7 @@
</Compile>
<Compile Include="DataStoreHelper.cs" />
<Compile Include="DataStoreProtoObject.cs" />
+ <Compile Include="ExtensionMethods.cs" />
<Compile Include="IDataStoreItem.cs" />
<Compile Include="DataType.cs" />
<Compile Include="IDataStoreCollection.cs" />
@@ -61,7 +62,6 @@
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
- <None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
diff --git a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs
index e5296ab4c..6b49ca4eb 100644
--- a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs
+++ b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs
@@ -2060,6 +2060,59 @@ namespace Tango.Emulations.Emulators
LogManager.Log(ex, "Failed.");
}
}
+
+ {
+ try
+ {
+ LogManager.Log("Testing int default...");
+
+ var res = await Transporter.SendRequest<GetDataStoreItemRequest, GetDataStoreItemResponse>(new GetDataStoreItemRequest()
+ {
+ Collection = "TEST",
+ Key = "intDefault",
+ DefaultItem = new PMR.DataStore.DataStoreItem()
+ {
+ DataType = DataType.Int32,
+ Int32Value = 10,
+ },
+ });
+
+ LogManager.Log(res.Container.Error != ErrorCode.None ? "Get Failed." : "Passed.");
+ LogManager.Log(res.ToJsonString());
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Failed.");
+ }
+ }
+
+ {
+ try
+ {
+ LogManager.Log("Testing proto default...");
+
+ var res = await Transporter.SendRequest<GetDataStoreItemRequest, GetDataStoreItemResponse>(new GetDataStoreItemRequest()
+ {
+ Collection = "TEST",
+ Key = "protoDefault",
+ DefaultItem = new PMR.DataStore.DataStoreItem()
+ {
+ DataType = DataType.Proto,
+ BytesValue = (new CalculateRequest() { A = 10, B = 15 }).ToByteString(),
+ ProtoType = MessageType.CalculateRequest,
+ },
+ });
+
+ LogManager.Log(res.Container.Error != ErrorCode.None ? "Get Failed." : "Passed.");
+
+ LogManager.Log(CalculateRequest.Parser.ParseFrom(res.Message.Item.BytesValue).ToJsonString());
+ LogManager.Log(res.ToJsonString());
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Failed.");
+ }
+ }
}
#endregion
diff --git a/Software/Visual_Studio/Tango.PMR/ExtensionMethods/IMessageExtensions.cs b/Software/Visual_Studio/Tango.PMR/ExtensionMethods/IMessageExtensions.cs
new file mode 100644
index 000000000..84acb51d2
--- /dev/null
+++ b/Software/Visual_Studio/Tango.PMR/ExtensionMethods/IMessageExtensions.cs
@@ -0,0 +1,27 @@
+using Google.Protobuf;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+
+public static class IMessageExtensions
+{
+ /// <summary>
+ /// Serializes this PMR message to byte array.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="message">The message.</param>
+ /// <returns></returns>
+ public static byte[] ToBytes<T>(this T message) where T : IMessage<T>
+ {
+ using (MemoryStream ms = new MemoryStream())
+ {
+ message.WriteTo(ms);
+ return ms.ToArray();
+ }
+ }
+}
+
diff --git a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj
index 7b3a7c397..bb44ef591 100644
--- a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj
+++ b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj
@@ -189,6 +189,7 @@
<Compile Include="Exports\JobFileLiquidVolume.cs" />
<Compile Include="Exports\JobFileSegment.cs" />
<Compile Include="ExtensionMethods.cs" />
+ <Compile Include="ExtensionMethods\IMessageExtensions.cs" />
<Compile Include="ExtensionMethods\VersionPackageDescriptorExtensions.cs" />
<Compile Include="FirmwareUpgrade\ActivateVersionRequest.cs" />
<Compile Include="FirmwareUpgrade\ActivateVersionResponse.cs" />
@@ -482,7 +483,7 @@
</PropertyGroup>
<ProjectExtensions>
<VisualStudio>
- <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" />
+ <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" />
</VisualStudio>
</ProjectExtensions>
</Project> \ No newline at end of file