From 034ba5c243b11ac62e7d6e5a0e1c4501143444af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Deniz=20=C4=B0rgin?= Date: Tue, 15 Oct 2019 20:38:23 +0300 Subject: [PATCH 1/4] WIP Communicate between framework mscorlib and core framework with Unit Tests (#116) * Communicate between mscorlib and System.Private.CoreLib * Strict string match * Add a binary file generator for all .NET frameworks * Add generated serialized files to project as suggestted in https://github.com/akkadotnet/Hyperion/pull/112#issuecomment-486078678_ * Add unit tests to test cross framework serialization and deserialization * FullFramework or CoreNetFramework runtime check * Using Constants instead * Downgrade FSharp.Core 4.7.0 to 4.6.2 because 4.7.0 is not compatible with netstandard1.6 * Add generated serialized file for .NET Core 3.0 to project * Add netcoreapp2.2 support to Hyperion.Tests Update Windows vm image to windows-2019 * Remove netcoreapp2.2 from Hyperion.Tests --- build-system/nightly-builds.yaml | 2 +- build-system/pr-validation.yaml | 2 +- build-system/windows-pr-validation.yaml | 2 +- build-system/windows-release.yaml | 2 +- .../Hyperion.Tests.FSharpData.fsproj | 4 + .../CrossFrameworkSerializationTests.cs | 37 ++++++ .../Generator/CrossFrameworkClass.cs | 125 ++++++++++++++++++ .../Generator/CrossFrameworkEnum.cs | 13 ++ .../Generator/CrossFrameworkInitializer.cs | 49 +++++++ .../Generator/CrossFrameworkStruct.cs | 83 ++++++++++++ src/Hyperion.Tests/Generator/Program.cs | 43 ++++++ src/Hyperion.Tests/Hyperion.Tests.csproj | 4 + .../Properties/launchSettings.json | 8 ++ .../test_file_.netcoreappversionv2.0.tf | Bin 0 -> 599 bytes .../test_file_.netcoreappversionv2.1.tf | Bin 0 -> 599 bytes .../test_file_.netcoreappversionv2.2.tf | Bin 0 -> 599 bytes .../test_file_.netcoreappversionv3.0.tf | Bin 0 -> 599 bytes .../test_file_.netframeworkversionv4.6.1.tf | Bin 0 -> 571 bytes src/Hyperion/Extensions/TypeEx.cs | 19 ++- 19 files changed, 385 insertions(+), 8 deletions(-) create mode 100644 src/Hyperion.Tests/CrossFrameworkSerializationTests.cs create mode 100644 src/Hyperion.Tests/Generator/CrossFrameworkClass.cs create mode 100644 src/Hyperion.Tests/Generator/CrossFrameworkEnum.cs create mode 100644 src/Hyperion.Tests/Generator/CrossFrameworkInitializer.cs create mode 100644 src/Hyperion.Tests/Generator/CrossFrameworkStruct.cs create mode 100644 src/Hyperion.Tests/Generator/Program.cs create mode 100644 src/Hyperion.Tests/Properties/launchSettings.json create mode 100644 src/Hyperion.Tests/testfiles/test_file_.netcoreappversionv2.0.tf create mode 100644 src/Hyperion.Tests/testfiles/test_file_.netcoreappversionv2.1.tf create mode 100644 src/Hyperion.Tests/testfiles/test_file_.netcoreappversionv2.2.tf create mode 100644 src/Hyperion.Tests/testfiles/test_file_.netcoreappversionv3.0.tf create mode 100644 src/Hyperion.Tests/testfiles/test_file_.netframeworkversionv4.6.1.tf diff --git a/build-system/nightly-builds.yaml b/build-system/nightly-builds.yaml index c8e91b27..273c5533 100644 --- a/build-system/nightly-builds.yaml +++ b/build-system/nightly-builds.yaml @@ -2,7 +2,7 @@ # See https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema for reference pool: - vmImage: vs2017-win2016 + vmImage: windows-2019 demands: Cmd trigger: none diff --git a/build-system/pr-validation.yaml b/build-system/pr-validation.yaml index 99a80dfb..6a62781c 100644 --- a/build-system/pr-validation.yaml +++ b/build-system/pr-validation.yaml @@ -18,7 +18,7 @@ jobs: parameters: name: 'windows_pr' displayName: 'Windows PR Validation' - vmImage: 'vs2017-win2016' + vmImage: 'windows-2019' scriptFileName: build.cmd scriptArgs: all - template: azure-pipeline.template.yaml diff --git a/build-system/windows-pr-validation.yaml b/build-system/windows-pr-validation.yaml index 47f6ea3b..0b50b03e 100644 --- a/build-system/windows-pr-validation.yaml +++ b/build-system/windows-pr-validation.yaml @@ -17,6 +17,6 @@ jobs: - template: azure-pipeline.template.yaml parameters: name: Windows - vmImage: 'vs2017-win2016' + vmImage: 'windows-2019' scriptFileName: build.cmd scriptArgs: all \ No newline at end of file diff --git a/build-system/windows-release.yaml b/build-system/windows-release.yaml index 6e3b17e4..43fe3dfb 100644 --- a/build-system/windows-release.yaml +++ b/build-system/windows-release.yaml @@ -2,7 +2,7 @@ # See https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema for reference pool: - vmImage: vs2017-win2016 + vmImage: windows-2019 demands: Cmd trigger: diff --git a/src/Hyperion.Tests.FSharpData/Hyperion.Tests.FSharpData.fsproj b/src/Hyperion.Tests.FSharpData/Hyperion.Tests.FSharpData.fsproj index ae47fb53..dac98890 100644 --- a/src/Hyperion.Tests.FSharpData/Hyperion.Tests.FSharpData.fsproj +++ b/src/Hyperion.Tests.FSharpData/Hyperion.Tests.FSharpData.fsproj @@ -8,4 +8,8 @@ + + + + diff --git a/src/Hyperion.Tests/CrossFrameworkSerializationTests.cs b/src/Hyperion.Tests/CrossFrameworkSerializationTests.cs new file mode 100644 index 00000000..08d5690f --- /dev/null +++ b/src/Hyperion.Tests/CrossFrameworkSerializationTests.cs @@ -0,0 +1,37 @@ +using System.IO; +using Hyperion.Tests.Generator; +using Xunit; + +namespace Hyperion.Tests +{ + public class CrossFrameworkSerializationTests + { + private readonly Serializer _serializer; + private readonly CrossFrameworkClass _originalObject; + + public CrossFrameworkSerializationTests() + { + _serializer = new Serializer(); + _originalObject = CrossFrameworkInitializer.Init(); + } + + [Fact] + public void CanSerializeCrossFramework() + { + const string defaultOutputPath = CrossFrameworkInitializer.DefaultOutputPath; + var testFiles = Directory.GetFiles(defaultOutputPath, "*.tf"); + + Assert.NotEmpty(testFiles); + + foreach (string testFile in testFiles) + { + using (var fileStream = new FileStream(testFile, FileMode.Open)) + { + var crossFrameworkClass = _serializer.Deserialize(fileStream); + + Assert.Equal(_originalObject, crossFrameworkClass); + } + } + } + } +} diff --git a/src/Hyperion.Tests/Generator/CrossFrameworkClass.cs b/src/Hyperion.Tests/Generator/CrossFrameworkClass.cs new file mode 100644 index 00000000..081021c0 --- /dev/null +++ b/src/Hyperion.Tests/Generator/CrossFrameworkClass.cs @@ -0,0 +1,125 @@ +using System; + +namespace Hyperion.Tests.Generator +{ + public class CrossFrameworkClass + { + public sbyte Sbyte { get; set; } + + public short Short { get; set; } + + public int Int { get; set; } + + public long Long { get; set; } + + public byte Byte { get; set; } + + public ushort UShort { get; set; } + + public uint UInt { get; set; } + + public ulong ULong { get; set; } + + public char Char { get; set; } + + public float Float { get; set; } + + public double Double { get; set; } + + public decimal Decimal { get; set; } + + public bool Boolean { get; set; } + + public string String { get; set; } + + public DateTime DateTime { get; set; } + + public Exception Exception { get; set; } + + public CrossFrameworkEnum Enum { get; set; } + + public CrossFrameworkStruct Struct { get; set; } + + public override bool Equals(object obj) + { + if (!(obj is CrossFrameworkClass)) + { + return false; + } + + var objectToCompare = (CrossFrameworkClass) obj; + + + //return Sbyte == objectToCompare.Sbyte + // && Short == objectToCompare.Short + // && Int == objectToCompare.Int + // && Long == objectToCompare.Long + // && Byte == objectToCompare.Byte + // && UShort == objectToCompare.UShort + // && UInt == objectToCompare.UInt + // && ULong == objectToCompare.ULong + // && Char == objectToCompare.Char + // && Math.Abs(Float - objectToCompare.Float) < float.Epsilon + // && Math.Abs(Double - objectToCompare.Double) < double.Epsilon + // && Decimal == objectToCompare.Decimal + // && Boolean == objectToCompare.Boolean + // && String == objectToCompare.String + // && DateTime == objectToCompare.DateTime + // && Exception == objectToCompare.Exception + // && Enum == objectToCompare.Enum + // && Struct.Equals(objectToCompare.Struct); + + return Equals(objectToCompare); + + } + + public override int GetHashCode() + { + unchecked + { + int hashCode = Sbyte.GetHashCode(); + hashCode = (hashCode * 397) ^ Short.GetHashCode(); + hashCode = (hashCode * 397) ^ Int; + hashCode = (hashCode * 397) ^ Long.GetHashCode(); + hashCode = (hashCode * 397) ^ Byte.GetHashCode(); + hashCode = (hashCode * 397) ^ UShort.GetHashCode(); + hashCode = (hashCode * 397) ^ (int) UInt; + hashCode = (hashCode * 397) ^ ULong.GetHashCode(); + hashCode = (hashCode * 397) ^ Char.GetHashCode(); + hashCode = (hashCode * 397) ^ Float.GetHashCode(); + hashCode = (hashCode * 397) ^ Double.GetHashCode(); + hashCode = (hashCode * 397) ^ Decimal.GetHashCode(); + hashCode = (hashCode * 397) ^ Boolean.GetHashCode(); + hashCode = (hashCode * 397) ^ (String != null ? String.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ DateTime.GetHashCode(); + hashCode = (hashCode * 397) ^ (Exception != null ? Exception.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ (int) Enum; + hashCode = (hashCode * 397) ^ Struct.GetHashCode(); + return hashCode; + } + } + + private bool Equals(CrossFrameworkClass other) + { + return Sbyte == other.Sbyte + && Short == other.Short + && Int == other.Int + && Long == other.Long + && Byte == other.Byte + && UShort == other.UShort + && UInt == other.UInt + && ULong == other.ULong + && Char == other.Char + && Math.Abs(Float - other.Float) < float.Epsilon + && Math.Abs(Double - other.Double) < double.Epsilon + && Decimal == other.Decimal + && Boolean == other.Boolean + && string.Equals(String, other.String) + && DateTime.Equals(other.DateTime) + // && Equals(Exception, other.Exception) + && Exception.Message == other.Exception.Message + && Enum == other.Enum + && Struct.Equals(other.Struct); + } + } +} \ No newline at end of file diff --git a/src/Hyperion.Tests/Generator/CrossFrameworkEnum.cs b/src/Hyperion.Tests/Generator/CrossFrameworkEnum.cs new file mode 100644 index 00000000..aaf0c112 --- /dev/null +++ b/src/Hyperion.Tests/Generator/CrossFrameworkEnum.cs @@ -0,0 +1,13 @@ +namespace Hyperion.Tests.Generator +{ + public enum CrossFrameworkEnum + { + ShortSword, + LongSword, + BastardSword, + Claymore, + Scimitar, + Yatagan, + Katana + } +} \ No newline at end of file diff --git a/src/Hyperion.Tests/Generator/CrossFrameworkInitializer.cs b/src/Hyperion.Tests/Generator/CrossFrameworkInitializer.cs new file mode 100644 index 00000000..dae3431f --- /dev/null +++ b/src/Hyperion.Tests/Generator/CrossFrameworkInitializer.cs @@ -0,0 +1,49 @@ +using System; + +namespace Hyperion.Tests.Generator +{ + public static class CrossFrameworkInitializer + { + public const string DefaultOutputPath = "../../../testfiles"; + + public static CrossFrameworkClass Init() + { + return new CrossFrameworkClass() + { + Exception = new Exception("Test message", new ArgumentNullException("param", "Cannot be null")), + DateTime = new DateTime(1944, 6, 6), // DDay + Enum = CrossFrameworkEnum.Yatagan, + String = "On June 6, 1944, more than 160,000 Allied troops landed along a 50-mile stretch of heavily-fortified French coastline", + Struct = new CrossFrameworkStruct() + { + Boolean = true, + Long = long.MaxValue, + Decimal = decimal.MinusOne, + Double = double.MaxValue, + Int = int.MaxValue, + Short = short.MaxValue, + ULong = ulong.MinValue, + Byte = byte.MaxValue, + Char = char.MaxValue, + Float = float.MinValue, + UShort = ushort.MinValue, + UInt = uint.MaxValue, + Sbyte = sbyte.MaxValue + }, + Decimal = decimal.MaxValue, + Float = float.MaxValue, + Long = long.MinValue, + Int = int.MinValue, + Double = double.Epsilon, + Char = char.MaxValue, + Byte = byte.MaxValue, + Sbyte = sbyte.MaxValue, + Short = short.MaxValue, + UInt = uint.MaxValue, + ULong = ulong.MaxValue, + UShort = ushort.MaxValue, + Boolean = true + }; + } + } +} \ No newline at end of file diff --git a/src/Hyperion.Tests/Generator/CrossFrameworkStruct.cs b/src/Hyperion.Tests/Generator/CrossFrameworkStruct.cs new file mode 100644 index 00000000..8bda1963 --- /dev/null +++ b/src/Hyperion.Tests/Generator/CrossFrameworkStruct.cs @@ -0,0 +1,83 @@ +using System; + +namespace Hyperion.Tests.Generator +{ + public struct CrossFrameworkStruct + { + public sbyte Sbyte { get; set; } + + public short Short { get; set; } + + public int Int { get; set; } + + public long Long { get; set; } + + public byte Byte { get; set; } + + public ushort UShort { get; set; } + + public uint UInt { get; set; } + + public ulong ULong { get; set; } + + public char Char { get; set; } + + public float Float { get; set; } + + public double Double { get; set; } + + public decimal Decimal { get; set; } + + public bool Boolean { get; set; } + + public override bool Equals(object obj) + { + if (!(obj is CrossFrameworkStruct)) + { + return false; + } + + var objectToCompare = (CrossFrameworkStruct)obj; + + return Equals(objectToCompare); + } + + public override int GetHashCode() + { + unchecked + { + int hashCode = Sbyte.GetHashCode(); + hashCode = (hashCode * 397) ^ Short.GetHashCode(); + hashCode = (hashCode * 397) ^ Int; + hashCode = (hashCode * 397) ^ Long.GetHashCode(); + hashCode = (hashCode * 397) ^ Byte.GetHashCode(); + hashCode = (hashCode * 397) ^ UShort.GetHashCode(); + hashCode = (hashCode * 397) ^ (int) UInt; + hashCode = (hashCode * 397) ^ ULong.GetHashCode(); + hashCode = (hashCode * 397) ^ Char.GetHashCode(); + hashCode = (hashCode * 397) ^ Float.GetHashCode(); + hashCode = (hashCode * 397) ^ Double.GetHashCode(); + hashCode = (hashCode * 397) ^ Decimal.GetHashCode(); + hashCode = (hashCode * 397) ^ Boolean.GetHashCode(); + return hashCode; + } + } + + private bool Equals(CrossFrameworkStruct other) + { + return Sbyte == other.Sbyte + && Short == other.Short + && Int == other.Int + && Long == other.Long + && Byte == other.Byte + && UShort == other.UShort + && UInt == other.UInt + && ULong == other.ULong + && Char == other.Char + && Math.Abs(Float - other.Float) < float.Epsilon + && Math.Abs(Double - other.Double) < double.Epsilon + && Decimal == other.Decimal + && Boolean == other.Boolean; + } + } +} \ No newline at end of file diff --git a/src/Hyperion.Tests/Generator/Program.cs b/src/Hyperion.Tests/Generator/Program.cs new file mode 100644 index 00000000..c0ae7045 --- /dev/null +++ b/src/Hyperion.Tests/Generator/Program.cs @@ -0,0 +1,43 @@ +using System.IO; +using System.Reflection; +using System.Runtime.Versioning; +using System.Text.RegularExpressions; + +namespace Hyperion.Tests.Generator +{ + internal static class Program + { + private static readonly Serializer Serializer = new Serializer(); + private static readonly string FullFrameworkName = Assembly + .GetEntryAssembly()? + .GetCustomAttribute()? + .FrameworkName; + + private static readonly string FrameworkName = Regex.Replace(FullFrameworkName, "[^\\w\\._]", string.Empty); + + private static void Main(string[] args) + { + if (args.Length != 1 || args[0] != "generate") + { + return; + } + + string outputPath = args.Length == 2 ? args[1] : CrossFrameworkInitializer.DefaultOutputPath; + + if (!Directory.Exists(outputPath)) + { + Directory.CreateDirectory(outputPath); + } + + CrossFrameworkClass crossFrameworkClass = CrossFrameworkInitializer.Init(); + + string fileName = $"test_file_{FrameworkName.ToLowerInvariant()}.tf"; + string fullPath = Path.Combine(outputPath, fileName); + + using (var fileStream = new FileStream(fullPath, FileMode.Create)) + { + Serializer.Serialize(crossFrameworkClass, fileStream); + } + } + } +} \ No newline at end of file diff --git a/src/Hyperion.Tests/Hyperion.Tests.csproj b/src/Hyperion.Tests/Hyperion.Tests.csproj index f97c9736..8bebdc43 100644 --- a/src/Hyperion.Tests/Hyperion.Tests.csproj +++ b/src/Hyperion.Tests/Hyperion.Tests.csproj @@ -2,7 +2,11 @@ + Exe net461;netcoreapp2.1;netcoreapp3.0 + true + latest + Hyperion.Tests.Generator.Program diff --git a/src/Hyperion.Tests/Properties/launchSettings.json b/src/Hyperion.Tests/Properties/launchSettings.json new file mode 100644 index 00000000..39bea140 --- /dev/null +++ b/src/Hyperion.Tests/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "Hyperion.Tests": { + "commandName": "Project", + "commandLineArgs": "generate" + } + } +} \ No newline at end of file diff --git a/src/Hyperion.Tests/testfiles/test_file_.netcoreappversionv2.0.tf b/src/Hyperion.Tests/testfiles/test_file_.netcoreappversionv2.0.tf new file mode 100644 index 0000000000000000000000000000000000000000..d5a25698361cde7ed224bef367dd6681891ba35b GIT binary patch literal 599 zcma)3%}N6?5Z)dHFXAiArMK<6g<25xP?lB^QK7y-x}CPcY*LchYC+iIU7xP+;UmOJ zU6mGu4rIQWWd6R4zlfsfdO1fcjZPlXkxQ;nqZMRql3C;2z={H&jeW|La4v@J=!W+` zTD`u1tlthJwtt1|Mvb6Y{5h-bynnm&by@5-IS4gQSPhqsut@qZInIeEj-kGJuyP>? zlgwDWm7}0wXBUIWfh0jyj`fr)7bf?n? zlgwDWm7}0wXBUIWfh0jyj`fr)7bf?n? zlgwDWm7}0wXBUIWfh0jyj`fr)7bf?n? zlgwDWm7}0wXBUIWfh0jyj`fr)7bf?n2}%%^HY-9YC+iIU7ybP@Dbvq z{uB#}1DP*FX6DN`6VHSYm#YPO481gX@BCd~%Mdd7ncavn ziuL33%j?s=;QP06U(ra8EuOObS@$c;z*c6LWH0qNVmDd^LX!_3N?Z{CI0F+(=d~JV zO-5{rgQNirh9GCiRjqAR&(A7@maZ$U|LAbom)1IhF@ojHL>=pzVa+Gmx{meo#==!) z5xN<)PdXj`2-5@2rG<94$cmzXp4JK{K;F4U04?o=BdML8frR6tWt2t;_myl&L L#LqN_6m9JtwLstb literal 0 HcmV?d00001 diff --git a/src/Hyperion/Extensions/TypeEx.cs b/src/Hyperion/Extensions/TypeEx.cs index a2aa56f7..32f31f1e 100644 --- a/src/Hyperion/Extensions/TypeEx.cs +++ b/src/Hyperion/Extensions/TypeEx.cs @@ -118,11 +118,23 @@ private static Type GetTypeFromManifestName(Stream stream, DeserializerSession s return TypeNameLookup.GetOrAdd(byteArr, b => { var shortName = StringEx.FromUtf8Bytes(b.Bytes, 0, b.Bytes.Length); +#if NET45 + if (shortName.Contains("System.Private.CoreLib,%core%")) + { + shortName = shortName.Replace("System.Private.CoreLib,%core%", "mscorlib,%core%"); + } +#endif +#if NETSTANDARD + if (shortName.Contains("mscorlib,%core%")) + { + shortName = shortName.Replace("mscorlib,%core%", "System.Private.CoreLib,%core%"); + } +#endif + var typename = ToQualifiedAssemblyName(shortName); return Type.GetType(typename, true); }); } - public static Type GetTypeFromManifestFull(Stream stream, DeserializerSession session) { var type = GetTypeFromManifestName(stream, session); @@ -195,7 +207,7 @@ public static int GetTypeSize(this Type type) throw new NotSupportedException(); } - + private static readonly string CoreAssemblyQualifiedName = 1.GetType().AssemblyQualifiedName; private static readonly string CoreAssemblyName = GetCoreAssemblyName(); private static readonly Regex cleanAssemblyVersionRegex = new Regex( @@ -204,8 +216,7 @@ public static int GetTypeSize(this Type type) private static string GetCoreAssemblyName() { - var name = 1.GetType().AssemblyQualifiedName; - var part = name.Substring( name.IndexOf(", Version", StringComparison.Ordinal)); + var part = CoreAssemblyQualifiedName.Substring(CoreAssemblyQualifiedName.IndexOf(", Version", StringComparison.Ordinal)); return part; } From 7ec4bd771052400ef0e2b7f9e2eb432b02d2dd4d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2019 17:46:02 +0000 Subject: [PATCH 2/4] Bump Microsoft.CSharp from 4.3.0 to 4.6.0 (#132) --- src/Hyperion/Hyperion.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Hyperion/Hyperion.csproj b/src/Hyperion/Hyperion.csproj index 45761062..c9a54535 100644 --- a/src/Hyperion/Hyperion.csproj +++ b/src/Hyperion/Hyperion.csproj @@ -11,12 +11,12 @@ - + - + From 105dffce8f61b50d72a48a2a2ca257d97c49bf34 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2019 13:14:35 -0500 Subject: [PATCH 3/4] Bump FSharp.Core from 4.6.2 to 4.7.0 (#135) Bumps [FSharp.Core](https://github.com/dotnet/fsharp) from 4.6.2 to 4.7.0. - [Release notes](https://github.com/dotnet/fsharp/releases) - [Changelog](https://github.com/dotnet/fsharp/blob/master/release-notes.md) - [Commits](https://github.com/dotnet/fsharp/commits) Signed-off-by: dependabot-preview[bot] --- src/Hyperion.Tests.FSharpData/Hyperion.Tests.FSharpData.fsproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Hyperion.Tests.FSharpData/Hyperion.Tests.FSharpData.fsproj b/src/Hyperion.Tests.FSharpData/Hyperion.Tests.FSharpData.fsproj index dac98890..9f89749e 100644 --- a/src/Hyperion.Tests.FSharpData/Hyperion.Tests.FSharpData.fsproj +++ b/src/Hyperion.Tests.FSharpData/Hyperion.Tests.FSharpData.fsproj @@ -9,7 +9,7 @@ - + From cbcbfdfa06fee6aadcd277700fba86b8527e8211 Mon Sep 17 00:00:00 2001 From: Aaron Stannard Date: Wed, 16 Oct 2019 13:15:13 -0500 Subject: [PATCH 4/4] added v0.9.10 Release Notes (#134) --- RELEASE_NOTES.md | 5 +++-- src/common.props | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index c05f4cef..a8d78fe3 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,2 +1,3 @@ -### 0.9.9 October 10 2019 #### -Hyperion now supports .NET Core 3.0. \ No newline at end of file +### 0.9.10 October 15 2019 #### + +Hyperion now [supports cross-framework communication between .NET Core and .NET Framework](https://github.com/akkadotnet/Hyperion/pull/116). \ No newline at end of file diff --git a/src/common.props b/src/common.props index 87d141de..f075f912 100644 --- a/src/common.props +++ b/src/common.props @@ -2,8 +2,8 @@ Copyright © 2016-2017 Akka.NET Team Akka.NET Team - 0.9.9 - Hyperion now supports .NET Core 3.0. + 0.9.10 + Hyperion now [supports cross-framework communication between .NET Core and .NET Framework](https://github.com/akkadotnet/Hyperion/pull/116). http://getakka.net/images/akkalogo.png https://github.com/akkadotnet/Hyperion https://github.com/akkadotnet/Hyperion/blob/master/LICENSE