From c0d4d11b545ebe6965e740369ebf0202e8f04d09 Mon Sep 17 00:00:00 2001 From: Mark J Price Date: Mon, 28 Feb 2022 20:09:20 +0000 Subject: [PATCH] Initial commit --- .../AssembliesAndNamespaces.csproj | 24 ++++++++ .../AssembliesAndNamespaces/Program.cs | 53 ++++++++++++++++++ vs4win/Chapter07/Chapter07.sln | 43 ++++++++++++++ vs4win/Chapter07/ControlSDK/Class1.cs | 5 ++ vs4win/Chapter07/ControlSDK/ControlSDK.csproj | 9 +++ vs4win/Chapter07/ControlSDK/global.json | 5 ++ .../DotNetEverywhere/DotNetEverywhere.csproj | 17 ++++++ vs4win/Chapter07/DotNetEverywhere/Program.cs | 21 +++++++ .../DotNetEverywhere/build-all-platforms.ps1 | 5 ++ .../SharedLibrary/SharedLibrary.csproj | 37 ++++++++++++ .../SharedLibrary/StringExtensions.cs | 26 +++++++++ .../packt-csdotnet-sharedlibrary.png | Bin 0 -> 24437 bytes .../AssembliesAndNamespaces.csproj | 24 ++++++++ .../AssembliesAndNamespaces/Program.cs | 53 ++++++++++++++++++ vscode/Chapter07/Chapter07.code-workspace | 16 ++++++ vscode/Chapter07/ControlSDK/Class1.cs | 5 ++ vscode/Chapter07/ControlSDK/ControlSDK.csproj | 9 +++ vscode/Chapter07/ControlSDK/global.json | 5 ++ .../DotNetEverywhere/DotNetEverywhere.csproj | 17 ++++++ vscode/Chapter07/DotNetEverywhere/Program.cs | 21 +++++++ .../DotNetEverywhere/build-all-platforms.ps1 | 5 ++ .../SharedLibrary/SharedLibrary.csproj | 37 ++++++++++++ .../SharedLibrary/StringExtensions.cs | 26 +++++++++ .../packt-csdotnet-sharedlibrary.png | Bin 0 -> 24437 bytes 24 files changed, 463 insertions(+) create mode 100644 vs4win/Chapter07/AssembliesAndNamespaces/AssembliesAndNamespaces.csproj create mode 100644 vs4win/Chapter07/AssembliesAndNamespaces/Program.cs create mode 100644 vs4win/Chapter07/Chapter07.sln create mode 100644 vs4win/Chapter07/ControlSDK/Class1.cs create mode 100644 vs4win/Chapter07/ControlSDK/ControlSDK.csproj create mode 100644 vs4win/Chapter07/ControlSDK/global.json create mode 100644 vs4win/Chapter07/DotNetEverywhere/DotNetEverywhere.csproj create mode 100644 vs4win/Chapter07/DotNetEverywhere/Program.cs create mode 100644 vs4win/Chapter07/DotNetEverywhere/build-all-platforms.ps1 create mode 100644 vs4win/Chapter07/SharedLibrary/SharedLibrary.csproj create mode 100644 vs4win/Chapter07/SharedLibrary/StringExtensions.cs create mode 100644 vs4win/Chapter07/SharedLibrary/packt-csdotnet-sharedlibrary.png create mode 100644 vscode/Chapter07/AssembliesAndNamespaces/AssembliesAndNamespaces.csproj create mode 100644 vscode/Chapter07/AssembliesAndNamespaces/Program.cs create mode 100644 vscode/Chapter07/Chapter07.code-workspace create mode 100644 vscode/Chapter07/ControlSDK/Class1.cs create mode 100644 vscode/Chapter07/ControlSDK/ControlSDK.csproj create mode 100644 vscode/Chapter07/ControlSDK/global.json create mode 100644 vscode/Chapter07/DotNetEverywhere/DotNetEverywhere.csproj create mode 100644 vscode/Chapter07/DotNetEverywhere/Program.cs create mode 100644 vscode/Chapter07/DotNetEverywhere/build-all-platforms.ps1 create mode 100644 vscode/Chapter07/SharedLibrary/SharedLibrary.csproj create mode 100644 vscode/Chapter07/SharedLibrary/StringExtensions.cs create mode 100644 vscode/Chapter07/SharedLibrary/packt-csdotnet-sharedlibrary.png diff --git a/vs4win/Chapter07/AssembliesAndNamespaces/AssembliesAndNamespaces.csproj b/vs4win/Chapter07/AssembliesAndNamespaces/AssembliesAndNamespaces.csproj new file mode 100644 index 0000000..f2fea01 --- /dev/null +++ b/vs4win/Chapter07/AssembliesAndNamespaces/AssembliesAndNamespaces.csproj @@ -0,0 +1,24 @@ + + + + Exe + net7.0 + enable + enable + + + + + + + + + + + + + + + + + diff --git a/vs4win/Chapter07/AssembliesAndNamespaces/Program.cs b/vs4win/Chapter07/AssembliesAndNamespaces/Program.cs new file mode 100644 index 0000000..79758b2 --- /dev/null +++ b/vs4win/Chapter07/AssembliesAndNamespaces/Program.cs @@ -0,0 +1,53 @@ +using System.Xml.Linq; // XDocument +using System; // String +using Packt.Shared; // IsValidHex(), IsValidXmlTag(), IsValidPassword() +using DialectSoftware.Collections; +using DialectSoftware.Collections.Generics; + +XDocument doc = new(); + +string s1 = "Hello"; +String s2 = "World"; +WriteLine($"{s1} {s2}"); + +Write("Enter a color value in hex: "); +string? hex = ReadLine(); // or "00ffc8" +WriteLine("Is {0} a valid color value? {1}", + arg0: hex, arg1: hex.IsValidHex()); + +Write("Enter a XML element: "); +string? xmlTag = ReadLine(); // or "

" +WriteLine("Is {0} a valid XML element? {1}", + arg0: xmlTag, arg1: xmlTag.IsValidXmlTag()); + +Write("Enter a password: "); +string? password = ReadLine(); // or "secretsauce" +WriteLine("Is {0} a valid password? {1}", + arg0: password, arg1: password.IsValidPassword()); + +Axis x = new("x", 0, 10, 1); +Axis y = new("y", 0, 4, 1); +Matrix matrix = new(new[] { x, y }); + +for (int i = 0; i < matrix.Axes[0].Points.Length; i++) +{ + matrix.Axes[0].Points[i].Label = "x" + i.ToString(); +} + +for (int i = 0; i < matrix.Axes[1].Points.Length; i++) +{ + matrix.Axes[1].Points[i].Label = "y" + i.ToString(); +} + +foreach (long[] c in matrix) +{ + matrix[c] = c[0] + c[1]; +} + +foreach (long[] c in matrix) +{ + WriteLine("{0},{1} ({2},{3}) = {4}", + matrix.Axes[0].Points[c[0]].Label, + matrix.Axes[1].Points[c[1]].Label, + c[0], c[1], matrix[c]); +} diff --git a/vs4win/Chapter07/Chapter07.sln b/vs4win/Chapter07/Chapter07.sln new file mode 100644 index 0000000..bd61759 --- /dev/null +++ b/vs4win/Chapter07/Chapter07.sln @@ -0,0 +1,43 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32210.308 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssembliesAndNamespaces", "AssembliesAndNamespaces\AssembliesAndNamespaces.csproj", "{4FD636C5-91F6-46AC-97B7-2396F11A31A8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedLibrary", "SharedLibrary\SharedLibrary.csproj", "{EDEB4531-EE20-440B-BB41-84CDA5715BA7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetEverywhere", "DotNetEverywhere\DotNetEverywhere.csproj", "{7509E104-A3AE-4AEB-9656-D83A15D5CD70}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ControlSDK", "ControlSDK\ControlSDK.csproj", "{76808C33-E138-4170-9621-122C1993B36E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4FD636C5-91F6-46AC-97B7-2396F11A31A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4FD636C5-91F6-46AC-97B7-2396F11A31A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4FD636C5-91F6-46AC-97B7-2396F11A31A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4FD636C5-91F6-46AC-97B7-2396F11A31A8}.Release|Any CPU.Build.0 = Release|Any CPU + {EDEB4531-EE20-440B-BB41-84CDA5715BA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EDEB4531-EE20-440B-BB41-84CDA5715BA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EDEB4531-EE20-440B-BB41-84CDA5715BA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EDEB4531-EE20-440B-BB41-84CDA5715BA7}.Release|Any CPU.Build.0 = Release|Any CPU + {7509E104-A3AE-4AEB-9656-D83A15D5CD70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7509E104-A3AE-4AEB-9656-D83A15D5CD70}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7509E104-A3AE-4AEB-9656-D83A15D5CD70}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7509E104-A3AE-4AEB-9656-D83A15D5CD70}.Release|Any CPU.Build.0 = Release|Any CPU + {76808C33-E138-4170-9621-122C1993B36E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76808C33-E138-4170-9621-122C1993B36E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76808C33-E138-4170-9621-122C1993B36E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76808C33-E138-4170-9621-122C1993B36E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {86EB53C2-864D-4ACE-91FC-C09189FDA62D} + EndGlobalSection +EndGlobal diff --git a/vs4win/Chapter07/ControlSDK/Class1.cs b/vs4win/Chapter07/ControlSDK/Class1.cs new file mode 100644 index 0000000..2e304c9 --- /dev/null +++ b/vs4win/Chapter07/ControlSDK/Class1.cs @@ -0,0 +1,5 @@ +namespace ControlSDK; +public class Class1 +{ + +} diff --git a/vs4win/Chapter07/ControlSDK/ControlSDK.csproj b/vs4win/Chapter07/ControlSDK/ControlSDK.csproj new file mode 100644 index 0000000..132c02c --- /dev/null +++ b/vs4win/Chapter07/ControlSDK/ControlSDK.csproj @@ -0,0 +1,9 @@ + + + + net6.0 + enable + enable + + + diff --git a/vs4win/Chapter07/ControlSDK/global.json b/vs4win/Chapter07/ControlSDK/global.json new file mode 100644 index 0000000..403171d --- /dev/null +++ b/vs4win/Chapter07/ControlSDK/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "6.0.200" + } +} \ No newline at end of file diff --git a/vs4win/Chapter07/DotNetEverywhere/DotNetEverywhere.csproj b/vs4win/Chapter07/DotNetEverywhere/DotNetEverywhere.csproj new file mode 100644 index 0000000..4357f26 --- /dev/null +++ b/vs4win/Chapter07/DotNetEverywhere/DotNetEverywhere.csproj @@ -0,0 +1,17 @@ + + + + Exe + net7.0 + enable + enable + + win10-x64;osx-x64;osx.11.0-arm64;linux-x64;linux-arm64 + + + + + + + + diff --git a/vs4win/Chapter07/DotNetEverywhere/Program.cs b/vs4win/Chapter07/DotNetEverywhere/Program.cs new file mode 100644 index 0000000..97bee7c --- /dev/null +++ b/vs4win/Chapter07/DotNetEverywhere/Program.cs @@ -0,0 +1,21 @@ +WriteLine("I can run everywhere!"); +WriteLine($"OS Version is {Environment.OSVersion}."); + +if (OperatingSystem.IsMacOS()) +{ + WriteLine("I am macOS."); +} +else if (OperatingSystem.IsWindowsVersionAtLeast(major: 10, build: 22000)) +{ + WriteLine("I am Windows 11."); +} +else if (OperatingSystem.IsWindowsVersionAtLeast(major: 10)) +{ + WriteLine("I am Windows 10."); +} +else +{ + WriteLine("I am some other mysterious OS."); +} +WriteLine("Press ENTER to stop me."); +ReadLine(); diff --git a/vs4win/Chapter07/DotNetEverywhere/build-all-platforms.ps1 b/vs4win/Chapter07/DotNetEverywhere/build-all-platforms.ps1 new file mode 100644 index 0000000..c75e90a --- /dev/null +++ b/vs4win/Chapter07/DotNetEverywhere/build-all-platforms.ps1 @@ -0,0 +1,5 @@ +dotnet publish -c Release -r win10-x64 +dotnet publish -c Release -r osx-x64 +dotnet publish -c Release -r osx.11.0-arm64 +dotnet publish -c Release -r linux-x64 +dotnet publish -c Release -r linux-arm64 \ No newline at end of file diff --git a/vs4win/Chapter07/SharedLibrary/SharedLibrary.csproj b/vs4win/Chapter07/SharedLibrary/SharedLibrary.csproj new file mode 100644 index 0000000..49a264c --- /dev/null +++ b/vs4win/Chapter07/SharedLibrary/SharedLibrary.csproj @@ -0,0 +1,37 @@ + + + + netstandard2.0 + true + Packt.CSdotnet.SharedLibrary + 7.0.0.0 + C# 11 and .NET 7 Shared Library + Mark J Price + + MS-PL + + + https://github.com/markjprice/cs11dotnet7 + + packt-csdotnet-sharedlibrary.png + true + + Example shared library packaged for NuGet. + + + Three extension methods to validate a string value. + + + Copyright © 2016-2022 Packt Publishing Limited + + string extensions packt csharp dotnet + + + + + True + + + + + diff --git a/vs4win/Chapter07/SharedLibrary/StringExtensions.cs b/vs4win/Chapter07/SharedLibrary/StringExtensions.cs new file mode 100644 index 0000000..72fdffa --- /dev/null +++ b/vs4win/Chapter07/SharedLibrary/StringExtensions.cs @@ -0,0 +1,26 @@ +using System.Text.RegularExpressions; + +namespace Packt.Shared +{ + public static class StringExtensions + { + public static bool IsValidXmlTag(this string input) + { + return Regex.IsMatch(input, + @"^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$"); + } + + public static bool IsValidPassword(this string input) + { + // minimum of eight valid characters + return Regex.IsMatch(input, "^[a-zA-Z0-9_-]{8,}$"); + } + + public static bool IsValidHex(this string input) + { + // three or six valid hex number characters + return Regex.IsMatch(input, + "^#?([a-fA-F0-9]{3}|[a-fA-F0-9]{6})$"); + } + } +} diff --git a/vs4win/Chapter07/SharedLibrary/packt-csdotnet-sharedlibrary.png b/vs4win/Chapter07/SharedLibrary/packt-csdotnet-sharedlibrary.png new file mode 100644 index 0000000000000000000000000000000000000000..c11feab9c1cd254455a2ba93a5a2456981c57e16 GIT binary patch literal 24437 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 literal 0 HcmV?d00001 diff --git a/vscode/Chapter07/AssembliesAndNamespaces/AssembliesAndNamespaces.csproj b/vscode/Chapter07/AssembliesAndNamespaces/AssembliesAndNamespaces.csproj new file mode 100644 index 0000000..f2fea01 --- /dev/null +++ b/vscode/Chapter07/AssembliesAndNamespaces/AssembliesAndNamespaces.csproj @@ -0,0 +1,24 @@ + + + + Exe + net7.0 + enable + enable + + + + + + + + + + + + + + + + + diff --git a/vscode/Chapter07/AssembliesAndNamespaces/Program.cs b/vscode/Chapter07/AssembliesAndNamespaces/Program.cs new file mode 100644 index 0000000..79758b2 --- /dev/null +++ b/vscode/Chapter07/AssembliesAndNamespaces/Program.cs @@ -0,0 +1,53 @@ +using System.Xml.Linq; // XDocument +using System; // String +using Packt.Shared; // IsValidHex(), IsValidXmlTag(), IsValidPassword() +using DialectSoftware.Collections; +using DialectSoftware.Collections.Generics; + +XDocument doc = new(); + +string s1 = "Hello"; +String s2 = "World"; +WriteLine($"{s1} {s2}"); + +Write("Enter a color value in hex: "); +string? hex = ReadLine(); // or "00ffc8" +WriteLine("Is {0} a valid color value? {1}", + arg0: hex, arg1: hex.IsValidHex()); + +Write("Enter a XML element: "); +string? xmlTag = ReadLine(); // or "

" +WriteLine("Is {0} a valid XML element? {1}", + arg0: xmlTag, arg1: xmlTag.IsValidXmlTag()); + +Write("Enter a password: "); +string? password = ReadLine(); // or "secretsauce" +WriteLine("Is {0} a valid password? {1}", + arg0: password, arg1: password.IsValidPassword()); + +Axis x = new("x", 0, 10, 1); +Axis y = new("y", 0, 4, 1); +Matrix matrix = new(new[] { x, y }); + +for (int i = 0; i < matrix.Axes[0].Points.Length; i++) +{ + matrix.Axes[0].Points[i].Label = "x" + i.ToString(); +} + +for (int i = 0; i < matrix.Axes[1].Points.Length; i++) +{ + matrix.Axes[1].Points[i].Label = "y" + i.ToString(); +} + +foreach (long[] c in matrix) +{ + matrix[c] = c[0] + c[1]; +} + +foreach (long[] c in matrix) +{ + WriteLine("{0},{1} ({2},{3}) = {4}", + matrix.Axes[0].Points[c[0]].Label, + matrix.Axes[1].Points[c[1]].Label, + c[0], c[1], matrix[c]); +} diff --git a/vscode/Chapter07/Chapter07.code-workspace b/vscode/Chapter07/Chapter07.code-workspace new file mode 100644 index 0000000..673f955 --- /dev/null +++ b/vscode/Chapter07/Chapter07.code-workspace @@ -0,0 +1,16 @@ +{ + "folders": [ + { + "path": "AssembliesAndNamespaces" + }, + { + "path": "SharedLibrary" + }, + { + "path": "ControlSDK" + }, + { + "path": "DotNetEverywhere" + } + ] +} \ No newline at end of file diff --git a/vscode/Chapter07/ControlSDK/Class1.cs b/vscode/Chapter07/ControlSDK/Class1.cs new file mode 100644 index 0000000..2e304c9 --- /dev/null +++ b/vscode/Chapter07/ControlSDK/Class1.cs @@ -0,0 +1,5 @@ +namespace ControlSDK; +public class Class1 +{ + +} diff --git a/vscode/Chapter07/ControlSDK/ControlSDK.csproj b/vscode/Chapter07/ControlSDK/ControlSDK.csproj new file mode 100644 index 0000000..132c02c --- /dev/null +++ b/vscode/Chapter07/ControlSDK/ControlSDK.csproj @@ -0,0 +1,9 @@ + + + + net6.0 + enable + enable + + + diff --git a/vscode/Chapter07/ControlSDK/global.json b/vscode/Chapter07/ControlSDK/global.json new file mode 100644 index 0000000..403171d --- /dev/null +++ b/vscode/Chapter07/ControlSDK/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "6.0.200" + } +} \ No newline at end of file diff --git a/vscode/Chapter07/DotNetEverywhere/DotNetEverywhere.csproj b/vscode/Chapter07/DotNetEverywhere/DotNetEverywhere.csproj new file mode 100644 index 0000000..4357f26 --- /dev/null +++ b/vscode/Chapter07/DotNetEverywhere/DotNetEverywhere.csproj @@ -0,0 +1,17 @@ + + + + Exe + net7.0 + enable + enable + + win10-x64;osx-x64;osx.11.0-arm64;linux-x64;linux-arm64 + + + + + + + + diff --git a/vscode/Chapter07/DotNetEverywhere/Program.cs b/vscode/Chapter07/DotNetEverywhere/Program.cs new file mode 100644 index 0000000..97bee7c --- /dev/null +++ b/vscode/Chapter07/DotNetEverywhere/Program.cs @@ -0,0 +1,21 @@ +WriteLine("I can run everywhere!"); +WriteLine($"OS Version is {Environment.OSVersion}."); + +if (OperatingSystem.IsMacOS()) +{ + WriteLine("I am macOS."); +} +else if (OperatingSystem.IsWindowsVersionAtLeast(major: 10, build: 22000)) +{ + WriteLine("I am Windows 11."); +} +else if (OperatingSystem.IsWindowsVersionAtLeast(major: 10)) +{ + WriteLine("I am Windows 10."); +} +else +{ + WriteLine("I am some other mysterious OS."); +} +WriteLine("Press ENTER to stop me."); +ReadLine(); diff --git a/vscode/Chapter07/DotNetEverywhere/build-all-platforms.ps1 b/vscode/Chapter07/DotNetEverywhere/build-all-platforms.ps1 new file mode 100644 index 0000000..c75e90a --- /dev/null +++ b/vscode/Chapter07/DotNetEverywhere/build-all-platforms.ps1 @@ -0,0 +1,5 @@ +dotnet publish -c Release -r win10-x64 +dotnet publish -c Release -r osx-x64 +dotnet publish -c Release -r osx.11.0-arm64 +dotnet publish -c Release -r linux-x64 +dotnet publish -c Release -r linux-arm64 \ No newline at end of file diff --git a/vscode/Chapter07/SharedLibrary/SharedLibrary.csproj b/vscode/Chapter07/SharedLibrary/SharedLibrary.csproj new file mode 100644 index 0000000..49a264c --- /dev/null +++ b/vscode/Chapter07/SharedLibrary/SharedLibrary.csproj @@ -0,0 +1,37 @@ + + + + netstandard2.0 + true + Packt.CSdotnet.SharedLibrary + 7.0.0.0 + C# 11 and .NET 7 Shared Library + Mark J Price + + MS-PL + + + https://github.com/markjprice/cs11dotnet7 + + packt-csdotnet-sharedlibrary.png + true + + Example shared library packaged for NuGet. + + + Three extension methods to validate a string value. + + + Copyright © 2016-2022 Packt Publishing Limited + + string extensions packt csharp dotnet + + + + + True + + + + + diff --git a/vscode/Chapter07/SharedLibrary/StringExtensions.cs b/vscode/Chapter07/SharedLibrary/StringExtensions.cs new file mode 100644 index 0000000..72fdffa --- /dev/null +++ b/vscode/Chapter07/SharedLibrary/StringExtensions.cs @@ -0,0 +1,26 @@ +using System.Text.RegularExpressions; + +namespace Packt.Shared +{ + public static class StringExtensions + { + public static bool IsValidXmlTag(this string input) + { + return Regex.IsMatch(input, + @"^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$"); + } + + public static bool IsValidPassword(this string input) + { + // minimum of eight valid characters + return Regex.IsMatch(input, "^[a-zA-Z0-9_-]{8,}$"); + } + + public static bool IsValidHex(this string input) + { + // three or six valid hex number characters + return Regex.IsMatch(input, + "^#?([a-fA-F0-9]{3}|[a-fA-F0-9]{6})$"); + } + } +} diff --git a/vscode/Chapter07/SharedLibrary/packt-csdotnet-sharedlibrary.png b/vscode/Chapter07/SharedLibrary/packt-csdotnet-sharedlibrary.png new file mode 100644 index 0000000000000000000000000000000000000000..c11feab9c1cd254455a2ba93a5a2456981c57e16 GIT binary patch literal 24437 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 literal 0 HcmV?d00001