diff --git a/extensions/src/AWSSDK.Extensions.CborProtocol/AWSSDK.Extensions.CborProtocol.NetFramework.csproj b/extensions/src/AWSSDK.Extensions.CborProtocol/AWSSDK.Extensions.CborProtocol.NetFramework.csproj new file mode 100644 index 000000000000..3bfc21e83660 --- /dev/null +++ b/extensions/src/AWSSDK.Extensions.CborProtocol/AWSSDK.Extensions.CborProtocol.NetFramework.csproj @@ -0,0 +1,45 @@ + + + + net472 + AWSSDK.Extensions.CborProtocol + AWSSDK.Extensions.CborProtocol + false + false + false + false + false + false + false + false + true + true + $(NoWarn);CS1591 + True + + + + + + + + + + ..\..\..\sdk\awssdk.dll.snk + + + + + $(AWSKeyFile) + + + + + + + + + + + + diff --git a/extensions/src/AWSSDK.Extensions.CborProtocol/AWSSDK.Extensions.CborProtocol.NetStandard.csproj b/extensions/src/AWSSDK.Extensions.CborProtocol/AWSSDK.Extensions.CborProtocol.NetStandard.csproj new file mode 100644 index 000000000000..e326b545b9bc --- /dev/null +++ b/extensions/src/AWSSDK.Extensions.CborProtocol/AWSSDK.Extensions.CborProtocol.NetStandard.csproj @@ -0,0 +1,51 @@ + + + + netstandard2.0;netcoreapp3.1;net8.0 + AWSSDK.Extensions.CborProtocol + AWSSDK.Extensions.CborProtocol + false + false + false + false + false + false + false + false + true + true + true + $(NoWarn);CS1591 + True + + + + + + + + IL2026,IL2075 + true + + + + + + ..\..\..\sdk\awssdk.dll.snk + + + + + $(AWSKeyFile) + + + + + + + + + + + + diff --git a/extensions/src/AWSSDK.Extensions.CborProtocol/CborWriterExtensions.cs b/extensions/src/AWSSDK.Extensions.CborProtocol/CborWriterExtensions.cs new file mode 100644 index 000000000000..06411c538fe0 --- /dev/null +++ b/extensions/src/AWSSDK.Extensions.CborProtocol/CborWriterExtensions.cs @@ -0,0 +1,122 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +using System; +using System.Formats.Cbor; +using Amazon.Util; + +namespace AWSSDK.Extensions.CborProtocol +{ + public static class CborWriterExtensions + { + /// + /// Writes the DateTime as UnixEpochSeconds which is the only type we support for CBOR. + /// + /// The CBOR writer to use. + /// The DateTime value to write. + public static void WriteDateTime(this CborWriter writer, DateTime value) + { + writer.WriteTag(CborTag.UnixTimeSeconds); + writer.WriteOptimizedNumber(AWSSDKUtils.ConvertToUnixEpochSecondsDouble(value)); + } + + /// + /// Writes a double using the smallest CBOR representation that preserves value and precision. + /// + /// The CBOR writer to use. + /// The double value to write. + public static void WriteOptimizedNumber(this CborWriter writer, double value) + { + if (double.IsNaN(value) || double.IsInfinity(value)) + { + writer.WriteDouble(value); // Write NaN or Infinity as a double. + return; + } + + // If the value is an integer (without fractional part), write it as Int64 or UInt64. + if (value % 1 == 0) + { + if (value >= long.MinValue && value <= long.MaxValue) + { + // If the value fits within the signed 64-bit integer (long) range, + // WriteInt64 serializes it into the smallest CBOR type representation + // that can contain its value without loss of precision. + writer.WriteInt64((long)value); + return; + } + + if (value >= 0 && value <= ulong.MaxValue) + { + // If the value is non-negative and fits within the unsigned 64-bit range, + // WriteUInt64 serializes it into the smallest possible CBOR type representation. + writer.WriteUInt64((ulong)value); + return; + } + } + + // Check if value can safely be represented as float32 + float floatCandidate = (float)value; + if ((double)floatCandidate == value) + { + WriteOptimizedNumber(writer, floatCandidate); + return; + } + + // If none of the above conditions are satisfied, write the value as a double. + writer.WriteDouble(value); + } + + /// + /// Writes a float using the smallest CBOR representation that preserves value and precision. + /// This method uses manual encoding to avoid writing as a half-precision float. + /// + /// The CBOR writer to use. + /// The float value to write. + public static void WriteOptimizedNumber(this CborWriter writer, float value) + { + // If the value is an integer (without fractional part), write it as Int64 or UInt64. + if (value % 1 == 0) + { + if (value >= long.MinValue && value <= long.MaxValue) + { + // If the value fits within the signed 64-bit integer (long) range, + // WriteInt64 serializes it into the smallest CBOR type representation + // that can contain its value without loss of precision. + writer.WriteInt64((long)value); + return; + } + + if (value >= 0 && value <= ulong.MaxValue) + { + // If the value is non-negative and fits within the unsigned 64-bit range, + // WriteUInt64 serializes it into the smallest possible CBOR type representation. + writer.WriteUInt64((ulong)value); + return; + } + } + + // Manual encoding to avoid half-precision floats + var bytes = new byte[5]; + bytes[0] = 0xFA; // CBOR float32 marker + BitConverter.GetBytes(value).CopyTo(bytes, 1); + + // Ensure the bytes are in the correct endian order for CBOR. + if (BitConverter.IsLittleEndian) + Array.Reverse(bytes, 1, 4); + + writer.WriteEncodedValue(bytes); + } + } +} diff --git a/extensions/src/AWSSDK.Extensions.CborProtocol/Directory.Build.props b/extensions/src/AWSSDK.Extensions.CborProtocol/Directory.Build.props new file mode 100644 index 000000000000..7ace368652d0 --- /dev/null +++ b/extensions/src/AWSSDK.Extensions.CborProtocol/Directory.Build.props @@ -0,0 +1,6 @@ + + + + $(MSBuildProjectDirectory)\obj\$(MSBuildProjectName) + + \ No newline at end of file diff --git a/extensions/src/AWSSDK.Extensions.CborProtocol/Internal/CborMarshallerContext.cs b/extensions/src/AWSSDK.Extensions.CborProtocol/Internal/CborMarshallerContext.cs new file mode 100644 index 000000000000..687e153f0be8 --- /dev/null +++ b/extensions/src/AWSSDK.Extensions.CborProtocol/Internal/CborMarshallerContext.cs @@ -0,0 +1,37 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +using Amazon.Runtime; +using Amazon.Runtime.Internal; +using Amazon.Runtime.Internal.Transform; +using Amazon.Runtime.Internal.Util; +using Amazon.Util; +using System; +using System.Collections.Generic; +using System.Formats.Cbor; +using System.IO; + +namespace AWSSDK.Extensions.CborProtocol.Internal +{ + public class CborMarshallerContext : MarshallerContext + { + public CborWriter Writer { get; private set; } + + public CborMarshallerContext(IRequest request, CborWriter writer) + : base(request) + { + Writer = writer; + } + } +} diff --git a/extensions/src/AWSSDK.Extensions.CborProtocol/Internal/CborWriterPool.cs b/extensions/src/AWSSDK.Extensions.CborProtocol/Internal/CborWriterPool.cs new file mode 100644 index 000000000000..10b770c43715 --- /dev/null +++ b/extensions/src/AWSSDK.Extensions.CborProtocol/Internal/CborWriterPool.cs @@ -0,0 +1,66 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +using System; +using System.Collections.Concurrent; +using System.Formats.Cbor; +using System.Threading; + +namespace AWSSDK.Extensions.CborProtocol.Internal +{ + public static class CborWriterPool + { + // Internal pool storage using thread-safe collection + private static readonly ConcurrentBag _pool = new ConcurrentBag(); + + // Maximum number of CborWriter instances the pool can hold + private static int _maxPoolSize = 16; + + /// + /// Gets or sets the maximum size of the writer pool. + /// Minimum value is 1. + /// + public static int MaxPoolSize + { + get => Volatile.Read(ref _maxPoolSize); + set => Volatile.Write(ref _maxPoolSize, Math.Max(1, value)); + } + + /// + /// Retrieves a CborWriter from the pool, or creates a new one if the pool is empty. + /// + public static CborWriter Rent() + { + if (_pool.TryTake(out var writer)) + { + return writer; + } + // Create a new CborWriter if the pool is empty + return new CborWriter(CborConformanceMode.Canonical, true); + } + + /// + /// Returns a CborWriter to the pool for reuse. + /// If the pool is already full then the writer will be discard. + /// + public static void Return(CborWriter writer) + { + if (_pool.Count >= Volatile.Read(ref _maxPoolSize)) + return; + + writer.Reset(); // Ensure the writer is in a clean state before pooling + _pool.Add(writer); + } + } +} diff --git a/extensions/src/AWSSDK.Extensions.CborProtocol/Properties/AssemblyInfo.cs b/extensions/src/AWSSDK.Extensions.CborProtocol/Properties/AssemblyInfo.cs new file mode 100644 index 000000000000..d9897716be94 --- /dev/null +++ b/extensions/src/AWSSDK.Extensions.CborProtocol/Properties/AssemblyInfo.cs @@ -0,0 +1,19 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("AWSSDK.Extensions.CborProtocol")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Amazon.com, Inc")] +[assembly: AssemblyProduct("AWS SDK for .NET extensions for Cbor protocol support")] +[assembly: AssemblyDescription("AWS SDK for .NET extensions for Cbor protocol support")] +[assembly: AssemblyCopyright("Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.")] +[assembly: AssemblyTrademark("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +[assembly: AssemblyVersion("4.0")] +[assembly: AssemblyFileVersion("4.0.0.0")] diff --git a/generator/ServiceClientGeneratorLib/GeneratorDriver.cs b/generator/ServiceClientGeneratorLib/GeneratorDriver.cs index 225f88179a9b..cccf88ae696a 100644 --- a/generator/ServiceClientGeneratorLib/GeneratorDriver.cs +++ b/generator/ServiceClientGeneratorLib/GeneratorDriver.cs @@ -1355,7 +1355,7 @@ internal static bool WriteFile(string baseOutputDir, /// Sets the marshaller of the generator based on the service type /// /// The marshaller to be set - /// If the service type is a type of json then normalizeMarshallers is set to true, false otherwise + /// If the service type is using structure marshallers then normalizeMarshallers is set to true, false otherwise void GetRequestMarshaller(out BaseRequestMarshaller marshaller, out bool normalizeMarshallers) { normalizeMarshallers = false; @@ -1366,6 +1366,10 @@ void GetRequestMarshaller(out BaseRequestMarshaller marshaller, out bool normali marshaller = new JsonRPCRequestMarshaller(); normalizeMarshallers = true; break; + case ServiceType.Cbor: + marshaller = new CborRequestMarshaller(); + normalizeMarshallers = true; + break; case ServiceType.Query: marshaller = new AWSQueryRequestMarshaller(); break; @@ -1388,6 +1392,8 @@ BaseRequestMarshaller GetStructureMarshaller() case ServiceType.Rest_Json: case ServiceType.Json: return new JsonRPCStructureMarshaller(); + case ServiceType.Cbor: + return new CborStructureMarshaller(); default: throw new Exception("No structure marshaller for service type: " + this.Configuration.ServiceModel.Type); } @@ -1409,6 +1415,8 @@ BaseResponseUnmarshaller GetResponseUnmarshaller() return new AWSQueryResponseUnmarshaller(); case ServiceType.Rest_Xml: return new RestXmlResponseUnmarshaller(); + case ServiceType.Cbor: + return new CborResponseUnmarshaller(); default: throw new Exception("No response unmarshaller for service type: " + this.Configuration.ServiceModel.Type); } @@ -1429,6 +1437,8 @@ BaseResponseUnmarshaller GetStructureUnmarshaller() return new AWSQueryStructureUnmarshaller(); case ServiceType.Rest_Xml: return new RestXmlStructureUnmarshaller(); + case ServiceType.Cbor: + return new CborStructureUnmarshaller(); default: throw new Exception("No structure unmarshaller for service type: " + this.Configuration.ServiceModel.Type); } @@ -1448,6 +1458,8 @@ BaseResponseUnmarshaller GetExceptionUnmarshaller() return new AWSQueryExceptionUnmarshaller(); case ServiceType.Rest_Xml: return new RestXmlExceptionUnmarshaller(); + case ServiceType.Cbor: + return new CborExceptionUnmarshaller(); default: throw new Exception("No structure unmarshaller for service type: " + this.Configuration.ServiceModel.Type); } diff --git a/generator/ServiceClientGeneratorLib/GeneratorEnumerations.cs b/generator/ServiceClientGeneratorLib/GeneratorEnumerations.cs index c4893f0ccf9c..4f49f69e46e2 100644 --- a/generator/ServiceClientGeneratorLib/GeneratorEnumerations.cs +++ b/generator/ServiceClientGeneratorLib/GeneratorEnumerations.cs @@ -9,7 +9,7 @@ namespace ServiceClientGenerator /// /// The set of data protocols used by AWS services /// - public enum ServiceType { Json, Query, Rest_Xml, Rest_Json }; + public enum ServiceType { Json, Query, Rest_Xml, Rest_Json, Cbor }; /// /// Where the properties of the request should be placed diff --git a/generator/ServiceClientGeneratorLib/Generators/Marshallers/CborRequestMarshaller.cs b/generator/ServiceClientGeneratorLib/Generators/Marshallers/CborRequestMarshaller.cs new file mode 100644 index 000000000000..a2bff38135c3 --- /dev/null +++ b/generator/ServiceClientGeneratorLib/Generators/Marshallers/CborRequestMarshaller.cs @@ -0,0 +1,343 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 17.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace ServiceClientGenerator.Generators.Marshallers +{ + using System.Linq; + using System.Text; + using System.Collections.Generic; + using System; + + /// + /// Class to produce the template output + /// + + #line 1 "C:\repos\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\Marshallers\CborRequestMarshaller.tt" + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public partial class CborRequestMarshaller : CborStructureMarshaller + { +#line hidden + /// + /// Create the template output + /// + public override string TransformText() + { + + #line 6 "C:\repos\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\Marshallers\CborRequestMarshaller.tt" + + AddLicenseHeader(); + + AddCommonUsingStatements(); + + + #line default + #line hidden + this.Write("using AWSSDK.Extensions.CborProtocol;\r\nusing AWSSDK.Extensions.CborProtocol.Inter" + + "nal;\r\n\r\n#pragma warning disable CS0612,CS0618\r\nnamespace "); + + #line 15 "C:\repos\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\Marshallers\CborRequestMarshaller.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.Namespace)); + + #line default + #line hidden + this.Write(".Model.Internal.MarshallTransformations\r\n{\r\n\t/// \r\n\t/// "); + + #line 18 "C:\repos\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\Marshallers\CborRequestMarshaller.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(this.Operation.Name)); + + #line default + #line hidden + this.Write(" Request Marshaller\r\n\t/// \r\n\tpublic class "); + + #line 20 "C:\repos\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\Marshallers\CborRequestMarshaller.tt" + this.Write(this.ToStringHelper.ToStringWithCulture(this.Operation.Name)); + + #line default + #line hidden + this.Write("RequestMarshaller : IMarshaller private readonly List _supportedProtocols = new List { + "smithy-rpc-v2-cbor", "json", "rest-json", "rest-xml", diff --git a/generator/ServiceClientGeneratorLib/SolutionFileCreator.cs b/generator/ServiceClientGeneratorLib/SolutionFileCreator.cs index 44d3c4b1c2c0..a39ff919d616 100644 --- a/generator/ServiceClientGeneratorLib/SolutionFileCreator.cs +++ b/generator/ServiceClientGeneratorLib/SolutionFileCreator.cs @@ -364,6 +364,15 @@ private void GenerateVS2017Solution(string solutionFileName, bool includeTests, ProjectGuid = projectGuidDictionary.ContainsKey(projectName) ? projectGuidDictionary[projectName] : Guid.NewGuid().ToString("B").ToUpper(), }); } + + // Add CborProtocol extension to core projects since it is required by some services. + var cborExtensionProjectName = string.Format("AWSSDK.Extensions.CborProtocol.{0}", configuration.Name); + coreProjects.Add(new Project + { + Name = cborExtensionProjectName, + ProjectPath = Utils.PathCombineAlt("..", "extensions", "src", "AWSSDK.Extensions.CborProtocol", $"{ cborExtensionProjectName}.csproj"), + ProjectGuid = projectGuidDictionary.ContainsKey(cborExtensionProjectName) ? projectGuidDictionary[cborExtensionProjectName] : Guid.NewGuid().ToString("B").ToUpper() + }); } IList testProjects = new List(); @@ -444,10 +453,11 @@ private void GenerateVS2017ServiceSolution(IEnumerable var session = new Dictionary(); var serviceSolutionFolders = new List(); var serviceDirectory = new DirectoryInfo(servicePath); - var folder = ServiceSolutionFolderFromPath(serviceDirectory.Name); + var serviceFolder = ServiceSolutionFolderFromPath(serviceDirectory.Name); var solutionFileName = serviceDirectory.Name + ".sln"; var serviceProjectDependencies = new List(); var testProjects = new List(); + var coreDependenciesProjects = new List(CoreProjects); var dependentProjects = new List(); var dependentProjectList = new List(); var solutionPath = Utils.PathCombineAlt(serviceDirectory.ToString(), solutionFileName); @@ -459,7 +469,7 @@ private void GenerateVS2017ServiceSolution(IEnumerable // To prevent all solution files from being modified, we re-use the GUID for the current service (if there's one available). if (projectGuidDictionary.ContainsKey(serviceDirectory.Name)) { - folder.ProjectGuid = projectGuidDictionary[serviceDirectory.Name]; + serviceFolder.ProjectGuid = projectGuidDictionary[serviceDirectory.Name]; } // Include only the service csproj files in the service specific solution. @@ -492,24 +502,33 @@ private void GenerateVS2017ServiceSolution(IEnumerable { filePath = Path.GetFileName(serviceProjectDependency); } - folder.Projects.Add(new Project + var project = new Project { Name = projectName, ProjectPath = filePath, ProjectGuid = projectGuidDictionary.ContainsKey(projectName) ? projectGuidDictionary[projectName] : Guid.NewGuid().ToString("B").ToUpper() - }); + }; + + if (filePath.Contains("AWSSDK.Extensions.")) // Extensions dependencies are added to the core folder not the service. + { + coreDependenciesProjects.Add(project); + } + else + { + serviceFolder.Projects.Add(project); + } } - if (folder.Projects.Count == 0) + if (serviceFolder.Projects.Count == 0) { continue; } ConvertToSlnRelativePath(testProjects, solutionPath); - serviceSolutionFolders.Add(folder); + serviceSolutionFolders.Add(serviceFolder); // Adding core projects to service solution - session["CoreProjects"] = CoreProjects; + session["CoreProjects"] = coreDependenciesProjects; // Adding service projects and its dependencies to the service solution session["ServiceSolutionFolders"] = serviceSolutionFolders; // Adding test projects to the service solution @@ -630,12 +649,12 @@ private List AddProjectDependencies(string projectFile, string serviceNa { var split = fileName.Split(Path.AltDirectorySeparatorChar); - // This is in a different folder in than the usual service dependencies. - // Also skipping the recursion since this does not currently have any ProjectReferences beyond Core - if (fileName.Contains("AWSSDK.Extensions.CrtIntegration")) + // Extensions are in a different folder in than the usual service dependencies. + // Also skipping the recursion since these does not currently have any ProjectReferences beyond Core + if (fileName.Contains("AWSSDK.Extensions.")) { - // Build the relative path to /extensions/src/AWSSDK.Extensions.CrtIntegration/AWSSDK.Extensions.CrtIntegration..csproj + // Build the relative path to /extensions/src/AWSSDK.Extensions.{ExtensionName}/AWSSDK.Extensions.{ExtensionName}..csproj var deps = Utils.PathCombineAlt("..", "..", "..", "..", split[split.Length - 4], split[split.Length - 3], split[split.Length - 2], split[split.Length - 1]); depsProjects.Add(deps); } diff --git a/sdk/AWSSDK.NetFramework.sln b/sdk/AWSSDK.NetFramework.sln index 39998e264643..d978af03636f 100644 --- a/sdk/AWSSDK.NetFramework.sln +++ b/sdk/AWSSDK.NetFramework.sln @@ -6,6 +6,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{9863FCB3-B EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AWSSDK.Core.NetFramework", "src/Core/AWSSDK.Core.NetFramework.csproj", "{1827E98F-AAD5-4354-897D-C64DA0F95495}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AWSSDK.Extensions.CborProtocol.NetFramework", "../extensions/src/AWSSDK.Extensions.CborProtocol/AWSSDK.Extensions.CborProtocol.NetFramework.csproj", "{139614FF-5A7B-4277-BFD3-234D04D3E149}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{939EC5C2-8345-43E2-8F97-72EEEBEEA0AB}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AccessAnalyzer", "AccessAnalyzer", "{D35E1267-0F99-4C3C-BC76-23E855530127}" @@ -1740,6 +1742,10 @@ Global {1827E98F-AAD5-4354-897D-C64DA0F95495}.Debug|Any CPU.Build.0 = Debug|Any CPU {1827E98F-AAD5-4354-897D-C64DA0F95495}.Release|Any CPU.ActiveCfg = Release|Any CPU {1827E98F-AAD5-4354-897D-C64DA0F95495}.Release|Any CPU.Build.0 = Release|Any CPU + {139614FF-5A7B-4277-BFD3-234D04D3E149}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {139614FF-5A7B-4277-BFD3-234D04D3E149}.Debug|Any CPU.Build.0 = Debug|Any CPU + {139614FF-5A7B-4277-BFD3-234D04D3E149}.Release|Any CPU.ActiveCfg = Release|Any CPU + {139614FF-5A7B-4277-BFD3-234D04D3E149}.Release|Any CPU.Build.0 = Release|Any CPU {C9E03D46-8113-4476-8B66-69A307DC193E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C9E03D46-8113-4476-8B66-69A307DC193E}.Debug|Any CPU.Build.0 = Debug|Any CPU {C9E03D46-8113-4476-8B66-69A307DC193E}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -3482,6 +3488,7 @@ Global EndGlobalSection GlobalSection(NestedProjects) = preSolution {1827E98F-AAD5-4354-897D-C64DA0F95495} = {9863FCB3-BFA4-4B9C-B8F6-302BA5F660B8} + {139614FF-5A7B-4277-BFD3-234D04D3E149} = {9863FCB3-BFA4-4B9C-B8F6-302BA5F660B8} {D35E1267-0F99-4C3C-BC76-23E855530127} = {939EC5C2-8345-43E2-8F97-72EEEBEEA0AB} {C9E03D46-8113-4476-8B66-69A307DC193E} = {D35E1267-0F99-4C3C-BC76-23E855530127} {952ED7BB-663B-47BD-B5D9-393AF6BFF3E5} = {939EC5C2-8345-43E2-8F97-72EEEBEEA0AB} diff --git a/sdk/AWSSDK.NetStandard.sln b/sdk/AWSSDK.NetStandard.sln index 9930eabac3e5..db3cd8c3646d 100644 --- a/sdk/AWSSDK.NetStandard.sln +++ b/sdk/AWSSDK.NetStandard.sln @@ -6,6 +6,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{9863FCB3-B EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AWSSDK.Core.NetStandard", "src/Core/AWSSDK.Core.NetStandard.csproj", "{15BB19BE-ABCA-441F-8217-3AE9A993B5E7}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AWSSDK.Extensions.CborProtocol.NetStandard", "../extensions/src/AWSSDK.Extensions.CborProtocol/AWSSDK.Extensions.CborProtocol.NetStandard.csproj", "{5AB6FB6A-C197-41DD-A6FF-21576B5859FB}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{939EC5C2-8345-43E2-8F97-72EEEBEEA0AB}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AccessAnalyzer", "AccessAnalyzer", "{CDEDFA0E-9192-5F7F-200A-5329D35913C5}" @@ -1736,6 +1738,10 @@ Global {15BB19BE-ABCA-441F-8217-3AE9A993B5E7}.Debug|Any CPU.Build.0 = Debug|Any CPU {15BB19BE-ABCA-441F-8217-3AE9A993B5E7}.Release|Any CPU.ActiveCfg = Release|Any CPU {15BB19BE-ABCA-441F-8217-3AE9A993B5E7}.Release|Any CPU.Build.0 = Release|Any CPU + {5AB6FB6A-C197-41DD-A6FF-21576B5859FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5AB6FB6A-C197-41DD-A6FF-21576B5859FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AB6FB6A-C197-41DD-A6FF-21576B5859FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5AB6FB6A-C197-41DD-A6FF-21576B5859FB}.Release|Any CPU.Build.0 = Release|Any CPU {81A3EBDE-824D-458E-9ABF-359E5B32B773}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {81A3EBDE-824D-458E-9ABF-359E5B32B773}.Debug|Any CPU.Build.0 = Debug|Any CPU {81A3EBDE-824D-458E-9ABF-359E5B32B773}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -3474,6 +3480,7 @@ Global EndGlobalSection GlobalSection(NestedProjects) = preSolution {15BB19BE-ABCA-441F-8217-3AE9A993B5E7} = {9863FCB3-BFA4-4B9C-B8F6-302BA5F660B8} + {5AB6FB6A-C197-41DD-A6FF-21576B5859FB} = {9863FCB3-BFA4-4B9C-B8F6-302BA5F660B8} {CDEDFA0E-9192-5F7F-200A-5329D35913C5} = {939EC5C2-8345-43E2-8F97-72EEEBEEA0AB} {81A3EBDE-824D-458E-9ABF-359E5B32B773} = {CDEDFA0E-9192-5F7F-200A-5329D35913C5} {AEF6C919-A19B-DF6C-2AEC-8537B2BEE229} = {939EC5C2-8345-43E2-8F97-72EEEBEEA0AB}