diff --git a/.github/workflows/dynamoNet6.0_build.yml b/.github/workflows/dynamoNet6.0_build.yml new file mode 100644 index 00000000000..bc5375361c9 --- /dev/null +++ b/.github/workflows/dynamoNet6.0_build.yml @@ -0,0 +1,41 @@ +# Build Dynamo using latest VS and DotNET +name: Dynamo-net6.0-Build +on: [push,pull_request] +jobs: + build: + runs-on: windows-latest + steps: + - name: Checkout Dynamo Repo + uses: actions/checkout@v2 + with: + path: Dynamo + repository: DynamoDS/Dynamo + - name: Setup dotnet + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + - name: Install dependencies for windows runtime + run: dotnet restore $Env:GITHUB_WORKSPACE\Dynamo\src\DynamoCore.net6.sln --runtime=win10-x64 + - name: Build Dynamo with MSBuild for Windows + run: | + echo "***Continue with the build, Good luck developer!***" + cd "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\" + .\MSBuild.exe $Env:GITHUB_WORKSPACE\Dynamo\src\DynamoCore.net6.sln /p:Configuration=Release /p:Platform=NET60_Windows + # look for Dynamo + - name: Navigate to Dynamo Windows Folder + run: | + cd "$Env:GITHUB_WORKSPACE\Dynamo\bin\NET60_Windows\Release" + echo "***Locating DynamoCLI for Windows!***" + test ".\DynamoCLI.exe" && echo "DynamoCLI exists!" + - name: Install dependencies for linux runtime + run: dotnet restore $Env:GITHUB_WORKSPACE\Dynamo\src\DynamoCore.net6.sln --runtime=linux-x64 + - name: Build Dynamo with MSBuild for Linux + run: | + echo "***Continue with the build, Good luck developer!***" + cd "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\" + .\MSBuild.exe $Env:GITHUB_WORKSPACE\Dynamo\src\DynamoCore.net6.sln /p:Configuration=Release /p:Platform=NET60_Linux + - name: Navigate to Dynamo Linux Folder + run: | + cd "$Env:GITHUB_WORKSPACE\Dynamo\bin\NET60_Linux\Release" + echo "***Locating DynamoCLI for Linux!***" + test ".\DynamoCLI.exe" && echo "DynamoCLI exists!" \ No newline at end of file diff --git a/src/Config/CS_SDK.props b/src/Config/CS_SDK.props index 43c770c4497..30a812431c9 100644 --- a/src/Config/CS_SDK.props +++ b/src/Config/CS_SDK.props @@ -1,14 +1,15 @@ + AnyCPU;x64;NET60_Windows;NET60_Linux; Debug AnyCPU + x64 16.0 net48 512 false false - $(SolutionDir)..\bin\AnyCPU\$(Configuration) - int\ + $(SolutionDir)..\bin\$(Platform)\$(Configuration) $(SolutionDir)..\extern\NUnit DirectX11 prompt @@ -19,8 +20,6 @@ true false MSB3539 - - v4.8 None true @@ -34,18 +33,37 @@ true TRACE + + net6.0 + + true + false + + + win10-x64 + + + linux-x64 + + + int\$(TargetFramework)\ + obj\$(TargetFramework)\ + + + + Properties\AssemblySharedInfo.cs - + false @@ -91,4 +109,19 @@ + + + + + v4.8 + + + + + + $(FrameworkAssembliesPath)System.Drawing.dll + + $(PkgSystem_Drawing_Common)\lib\net6.0\System.Drawing.Common.dll + + diff --git a/src/Dynamo.All.sln b/src/Dynamo.All.sln index e04b620cc1b..a78a9d20570 100644 --- a/src/Dynamo.All.sln +++ b/src/Dynamo.All.sln @@ -1013,4 +1013,4 @@ Global GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {89CB19C6-BF0A-4E6A-BFDA-79D143EAB59D} EndGlobalSection -EndGlobal +EndGlobal \ No newline at end of file diff --git a/src/DynamoApplications/DynamoApplications.csproj b/src/DynamoApplications/DynamoApplications.csproj index 9f8a5fceb87..12383a79d2b 100644 --- a/src/DynamoApplications/DynamoApplications.csproj +++ b/src/DynamoApplications/DynamoApplications.csproj @@ -1,4 +1,4 @@ - + @@ -9,8 +9,11 @@ DynamoApplications DynamoApplications - - + + + + + diff --git a/src/DynamoApplications/StartupUtils.cs b/src/DynamoApplications/StartupUtils.cs index 2e33dd86daa..04f99bbc003 100644 --- a/src/DynamoApplications/StartupUtils.cs +++ b/src/DynamoApplications/StartupUtils.cs @@ -13,11 +13,59 @@ using Dynamo.Updates; using DynamoApplications.Properties; using DynamoShapeManager; +using DynamoUtilities; using Microsoft.Win32; +#if NET6_0_OR_GREATER +using CommandLine; +#else using NDesk.Options; +#endif namespace Dynamo.Applications { +#if NET6_0_OR_GREATER + internal class CMDLineOptions + { + [Option('l', "Locale", Required = false, HelpText = "Running Dynamo under a different locale setting.")] + public string Locale { get; set; } = String.Empty; + [Option('c', "CommandFilePath", Required = false, HelpText = "Instruct Dynamo to open a commandfile and run the commands it contains at this path," + + "this option is only supported when run from DynamoSandbox")] + public string CommandFilePath { get; set; } = String.Empty; + [Option('o', "OpenFilePath", Required = false, HelpText = "Instruct Dynamo to open headless and run a dyn file at this path.")] + public string OpenFilePath { get; set; } = String.Empty; + [Option('v', "Verbose", Required = false, HelpText = "Instruct Dynamo to output all evalautions it performs to an xml file at this path.")] + public string Verbose { get; set; } = String.Empty; + [Option('x', "ConvertFile", Required = false, HelpText = "When used in combination with the 'O' flag, opens a .dyn file from the specified path and converts it to .json." + + "File will have the .json extension and be located in the same directory as the original file.")] + public bool ConvertFile { get; set; } + [Option('g', "Geometry", Required = false, HelpText = "Instruct Dynamo to output geometry from all evaluations to a json file at this path.")] + public string GeometryFilePath { get; set; } = String.Empty; + [Option('i', "Import", Required = false, HelpText = "Instruct Dynamo to import an assembly as a node library.This argument should be a filepath to a single.dll" + + " - if you wish to import multiple dlls - list the dlls separated by a space: -i 'assembly1.dll' 'assembly2.dll'")] + public IEnumerable ImportedPaths { get; set; } = new List(); + [Option('g', "GeometryPath", Required = false, HelpText = "relative or absolute path to a directory containing ASM. When supplied, instead of searching the hard disk for ASM, it will be loaded directly from this path.")] + public string ASMPath { get; set; } = String.Empty; + [Option('k', "KeepAlive", Required = false, HelpText = "Keepalive mode, leave the Dynamo process running until a loaded extension shuts it down.")] + public bool KeepAlive { get; set; } + [Option('n', "NoConsole", Required = false, HelpText = "Don't rely on the console window to interact with CLI in Keepalive mode.")] + public bool NoConsole { get; set; } + [Option('u', "UserData", Required = false, HelpText = "Specify user data folder to be used by PathResolver with CLI.")] + public string UserDataFolder { get; set; } = String.Empty; + [Option("CommonData", Required = false, HelpText = "Specify common data folder to be used by PathResolver with CLI.")] + public string CommonDataFolder { get; set; } = String.Empty; + [Option("HostName", Required = false, HelpText = "Identify Dynamo variation associated with host.")] + public string HostName { get; set; } = String.Empty; + [Option("DisableAnalytics", Required = false, HelpText = "Disables analytics in Dynamo for the process liftime.")] + public bool DisableAnalytics { get; set; } + [Option("ParentId", Required = false, HelpText = "Identify Dynamo host analytics parent id.")] + public string ParentId { get; set; } = String.Empty; + [Option("SessionId", Required = false, HelpText = "Identify Dynamo host analytics session id.")] + public string SessionId { get; set; } = String.Empty; + [Option("CERLocation", Required = false, HelpText = "Specify the crash error report tool location on disk.")] + public string CERLocation { get; set; } = String.Empty; + } +#endif + public class StartupUtils { //TODO internal? @@ -25,7 +73,10 @@ public class StartupUtils /// Raised when loading of the ASM binaries fails. A failure message is passed as a parameter. /// public static event Action ASMPreloadFailure; - + +#if NET6_0_OR_GREATER + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif internal class SandboxLookUp : DynamoLookUp { public override IEnumerable GetDynamoInstallLocations() @@ -69,6 +120,34 @@ public struct CommandLineArguments { public static CommandLineArguments Parse(string[] args) { +#if NET6_0_OR_GREATER + + return Parser.Default.ParseArguments(args).MapResult((cmdArgs) => { + if (!string.IsNullOrEmpty(cmdArgs.Verbose) && string.IsNullOrEmpty(cmdArgs.OpenFilePath)) + { + Console.WriteLine("you must supply a file to open if you want to save an evaluation output "); + } + + return new CommandLineArguments() + { + Locale = cmdArgs.Locale, + CommandFilePath = cmdArgs.CommandFilePath, + OpenFilePath = cmdArgs.OpenFilePath, + Verbose = cmdArgs.Verbose, + ConvertFile = cmdArgs.ConvertFile, + GeometryFilePath = cmdArgs.GeometryFilePath, + ImportedPaths = cmdArgs.ImportedPaths, + ASMPath = cmdArgs.ASMPath, + KeepAlive = cmdArgs.KeepAlive, + NoConsole = cmdArgs.NoConsole, + UserDataFolder = cmdArgs.UserDataFolder, + CommonDataFolder = cmdArgs.CommonDataFolder, + DisableAnalytics = cmdArgs.DisableAnalytics, + AnalyticsInfo = new HostAnalyticsInfo() { HostName = cmdArgs.HostName, ParentId = cmdArgs.ParentId, SessionId = cmdArgs.SessionId }, + CERLocation = cmdArgs.CERLocation + }; + }, errs => new CommandLineArguments()); +#else // Running Dynamo sandbox with a command file: // DynamoSandbox.exe /c "C:\file path\file.xml" // @@ -172,14 +251,17 @@ public static CommandLineArguments Parse(string[] args) AnalyticsInfo = new HostAnalyticsInfo() { HostName = hostname, ParentId = parentId, SessionId = sessionId }, CERLocation = cerLocation }; +#endif } +#if NET6_0_OR_GREATER +#else private static void ShowHelp(OptionSet opSet) { Console.WriteLine("options:"); opSet.WriteOptionDescriptions(Console.Out); } - +#endif public string Locale { get; set; } public string CommandFilePath { get; set; } public string OpenFilePath { get; set; } @@ -196,7 +278,6 @@ private static void ShowHelp(OptionSet opSet) public string HostName { get; set; } public bool DisableAnalytics { get; set; } public HostAnalyticsInfo AnalyticsInfo { get; set; } - public string CERLocation { get; set; } } @@ -205,6 +286,9 @@ private static void ShowHelp(OptionSet opSet) /// /// libG ProtoInterface path /// libG folder path +#if NET6_0_OR_GREATER + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif public static void PreloadShapeManager(ref string geometryFactoryPath, ref string preloaderLocation) { var exePath = Assembly.GetExecutingAssembly().Location; @@ -227,6 +311,9 @@ public static void PreloadShapeManager(ref string geometryFactoryPath, ref strin ///for now, building an updatemanager instance requires finding Dynamo install location ///which if we are running on mac os or *nix will use different logic then SandboxLookup /// +#if NET6_0_OR_GREATER + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif private static IUpdateManager InitializeUpdateManager() { var cfg = UpdateManagerConfiguration.GetSettings(new SandboxLookUp()); @@ -312,7 +399,7 @@ public static DynamoModel MakeModel(bool CLImode) private static bool PreloadASM(string asmPath, out string geometryFactoryPath, out string preloaderLocation ) { - if (string.IsNullOrEmpty(asmPath)) + if (string.IsNullOrEmpty(asmPath) && OSHelper.IsWindows()) { geometryFactoryPath = string.Empty; preloaderLocation = string.Empty; @@ -378,7 +465,7 @@ private static DynamoModel StartDynamoWithDefaultConfig(bool CLImode, CLIMode = CLImode }; config.AuthProvider = CLImode ? null : new Core.IDSDKManager(); - config.UpdateManager = CLImode ? null : InitializeUpdateManager(); + config.UpdateManager = CLImode ? null : OSHelper.IsWindows() ? InitializeUpdateManager() : null; config.StartInTestMode = CLImode; config.PathResolver = CLImode ? new CLIPathResolver(preloaderLocation, userDataFolder, commonDataFolder) as IPathResolver : new SandboxPathResolver(preloaderLocation) as IPathResolver; diff --git a/src/DynamoCLI/DynamoCLI.csproj b/src/DynamoCLI/DynamoCLI.csproj index d9fd20e4a27..9edcaeab983 100644 --- a/src/DynamoCLI/DynamoCLI.csproj +++ b/src/DynamoCLI/DynamoCLI.csproj @@ -1,4 +1,4 @@ - + @@ -8,11 +8,12 @@ Properties DynamoCLI DynamoCLI + false true - + @@ -40,6 +41,7 @@ {c0d6dee5-5532-4345-9c66-4c00d7fdb8be} DesignScriptBuiltin + False {ef879a10-041d-4c68-83e7-3192685f1bae} diff --git a/src/DynamoCLI/Program.cs b/src/DynamoCLI/Program.cs index b9b9338cfd8..bc916f338d3 100644 --- a/src/DynamoCLI/Program.cs +++ b/src/DynamoCLI/Program.cs @@ -1,5 +1,7 @@ using System; +using System.IO; using System.Linq; +using System.Reflection; using System.Threading; using Dynamo.Applications; using Dynamo.Models; @@ -30,7 +32,6 @@ static internal void Main(string[] args) var thread = new Thread(() => RunKeepAlive(cmdLineArgs)); thread.Name = "DynamoModelKeepAlive"; - thread.SetApartmentState(ApartmentState.STA); thread.Start(); if (!useConsole) @@ -85,8 +86,6 @@ private static void RunKeepAlive(StartupUtils.CommandLineArguments cmdLineArgs) Console.WriteLine("DynamoCLI is running in keepalive mode"); Console.WriteLine("Press Enter to shutdown..."); } - - System.Windows.Threading.Dispatcher.Run(); } catch { diff --git a/src/DynamoCore.net6.sln b/src/DynamoCore.net6.sln new file mode 100644 index 00000000000..3ddc77aa6cd --- /dev/null +++ b/src/DynamoCore.net6.sln @@ -0,0 +1,280 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32901.215 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamoCore", "DynamoCore\DynamoCore.csproj", "{7858FA8C-475F-4B8E-B468-1F8200778CF8}" + ProjectSection(ProjectDependencies) = postProject + {133FC760-5699-46D9-BEA6-E816B5F01016} = {133FC760-5699-46D9-BEA6-E816B5F01016} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Engine", "Engine", "{A6533823-A64A-441C-B7A2-7B2772F87002}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProtoAssociative", "Engine\ProtoAssociative\ProtoAssociative.csproj", "{7318D5E5-9D15-4ABE-8A51-92F58D4F0B85}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProtoCore", "Engine\ProtoCore\ProtoCore.csproj", "{7A9E0314-966F-4584-BAA3-7339CBB849D1}" + ProjectSection(ProjectDependencies) = postProject + {133FC760-5699-46D9-BEA6-E816B5F01016} = {133FC760-5699-46D9-BEA6-E816B5F01016} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProtoImperative", "Engine\ProtoImperative\ProtoImperative.csproj", "{0D3D43DC-BD7E-46F0-93F7-1C6A6CC79948}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProtoScript", "Engine\ProtoScript\ProtoScript.csproj", "{A4794476-7D0E-41C0-AD83-4AB929C0A46C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{FA7BE306-A3B0-45FA-9D87-0C69E6932C13}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreNodes", "Libraries\CoreNodes\CoreNodes.csproj", "{87550B2B-6CB8-461E-8965-DFAFE3AAFB5C}" + ProjectSection(ProjectDependencies) = postProject + {133FC760-5699-46D9-BEA6-E816B5F01016} = {133FC760-5699-46D9-BEA6-E816B5F01016} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreNodeModels", "Libraries\CoreNodeModels\CoreNodeModels.csproj", "{D8262D40-4880-41E4-91E4-AF8F480C8637}" + ProjectSection(ProjectDependencies) = postProject + {C5ADC05B-34E8-47BF-8E78-9C7BF96418C2} = {C5ADC05B-34E8-47BF-8E78-9C7BF96418C2} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamoServices", "NodeServices\DynamoServices.csproj", "{EF879A10-041D-4C68-83E7-3192685F1BAE}" + ProjectSection(ProjectDependencies) = postProject + {133FC760-5699-46D9-BEA6-E816B5F01016} = {133FC760-5699-46D9-BEA6-E816B5F01016} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamoUtilities", "DynamoUtilities\DynamoUtilities.csproj", "{B5F435CB-0D8A-40B1-A4F7-5ECB3CE792A9}" + ProjectSection(ProjectDependencies) = postProject + {133FC760-5699-46D9-BEA6-E816B5F01016} = {133FC760-5699-46D9-BEA6-E816B5F01016} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Units", "Libraries\DynamoUnits\Units.csproj", "{6E0A079E-85F1-45A1-AD5B-9855E4344809}" + ProjectSection(ProjectDependencies) = postProject + {133FC760-5699-46D9-BEA6-E816B5F01016} = {133FC760-5699-46D9-BEA6-E816B5F01016} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GraphLayout", "Engine\GraphLayout\GraphLayout.csproj", "{C2595B04-856D-40AE-8B99-4804C7A70708}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VMDataBridge", "Libraries\VMDataBridge\VMDataBridge.csproj", "{CCB6E56B-2DA1-4EBA-A1F9-E8510E129D12}" + ProjectSection(ProjectDependencies) = postProject + {133FC760-5699-46D9-BEA6-E816B5F01016} = {133FC760-5699-46D9-BEA6-E816B5F01016} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{D114C59C-CF66-4CC2-980F-9301FB4EA4E1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamoConversions", "Libraries\DynamoConversions\DynamoConversions.csproj", "{C5ADC05B-34E8-47BF-8E78-9C7BF96418C2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamoShapeManager", "Tools\DynamoShapeManager\DynamoShapeManager.csproj", "{263FA9C1-F81E-4A8E-95E0-8CDAE20F177B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamoInstallDetective", "Tools\DynamoInstallDetective\DynamoInstallDetective.csproj", "{98692887-B389-4F73-A71A-9FC516738DAB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamoCLI", "DynamoCLI\DynamoCLI.csproj", "{5F9AE581-6781-4A4C-A262-1B06CD27208B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamoApplications", "DynamoApplications\DynamoApplications.csproj", "{AA782772-FE61-4226-BAA4-EB529FA1646B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamoPackages", "DynamoPackages\DynamoPackages.csproj", "{47533B7C-0E1A-44A4-8511-B438645F052A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DesignScriptBuiltin", "Libraries\DesignScriptBuiltin\DesignScriptBuiltin.csproj", "{C0D6DEE5-5532-4345-9C66-4C00D7FDB8BE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions", "Extensions", "{88D45B00-E564-41DB-B57C-9509646CAA49}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AssemblyInfoGenerator", "AssemblySharedInfoGenerator\AssemblyInfoGenerator.csproj", "{133FC760-5699-46D9-BEA6-E816B5F01016}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamoFeatureFlags", "Tools\DynamoFeatureFlags\DynamoFeatureFlags.csproj", "{94CF053D-BB66-4FC7-883B-48F072701BA9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|NET60_Linux = Debug|NET60_Linux + Debug|NET60_Windows = Debug|NET60_Windows + Release|NET60_Linux = Release|NET60_Linux + Release|NET60_Windows = Release|NET60_Windows + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7858FA8C-475F-4B8E-B468-1F8200778CF8}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {7858FA8C-475F-4B8E-B468-1F8200778CF8}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {7858FA8C-475F-4B8E-B468-1F8200778CF8}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {7858FA8C-475F-4B8E-B468-1F8200778CF8}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {7858FA8C-475F-4B8E-B468-1F8200778CF8}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {7858FA8C-475F-4B8E-B468-1F8200778CF8}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {7858FA8C-475F-4B8E-B468-1F8200778CF8}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {7858FA8C-475F-4B8E-B468-1F8200778CF8}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {7318D5E5-9D15-4ABE-8A51-92F58D4F0B85}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {7318D5E5-9D15-4ABE-8A51-92F58D4F0B85}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {7318D5E5-9D15-4ABE-8A51-92F58D4F0B85}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {7318D5E5-9D15-4ABE-8A51-92F58D4F0B85}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {7318D5E5-9D15-4ABE-8A51-92F58D4F0B85}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {7318D5E5-9D15-4ABE-8A51-92F58D4F0B85}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {7318D5E5-9D15-4ABE-8A51-92F58D4F0B85}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {7318D5E5-9D15-4ABE-8A51-92F58D4F0B85}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {7A9E0314-966F-4584-BAA3-7339CBB849D1}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {7A9E0314-966F-4584-BAA3-7339CBB849D1}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {7A9E0314-966F-4584-BAA3-7339CBB849D1}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {7A9E0314-966F-4584-BAA3-7339CBB849D1}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {7A9E0314-966F-4584-BAA3-7339CBB849D1}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {7A9E0314-966F-4584-BAA3-7339CBB849D1}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {7A9E0314-966F-4584-BAA3-7339CBB849D1}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {7A9E0314-966F-4584-BAA3-7339CBB849D1}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {0D3D43DC-BD7E-46F0-93F7-1C6A6CC79948}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {0D3D43DC-BD7E-46F0-93F7-1C6A6CC79948}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {0D3D43DC-BD7E-46F0-93F7-1C6A6CC79948}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {0D3D43DC-BD7E-46F0-93F7-1C6A6CC79948}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {0D3D43DC-BD7E-46F0-93F7-1C6A6CC79948}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {0D3D43DC-BD7E-46F0-93F7-1C6A6CC79948}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {0D3D43DC-BD7E-46F0-93F7-1C6A6CC79948}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {0D3D43DC-BD7E-46F0-93F7-1C6A6CC79948}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {A4794476-7D0E-41C0-AD83-4AB929C0A46C}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {A4794476-7D0E-41C0-AD83-4AB929C0A46C}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {A4794476-7D0E-41C0-AD83-4AB929C0A46C}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {A4794476-7D0E-41C0-AD83-4AB929C0A46C}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {A4794476-7D0E-41C0-AD83-4AB929C0A46C}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {A4794476-7D0E-41C0-AD83-4AB929C0A46C}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {A4794476-7D0E-41C0-AD83-4AB929C0A46C}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {A4794476-7D0E-41C0-AD83-4AB929C0A46C}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {87550B2B-6CB8-461E-8965-DFAFE3AAFB5C}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {87550B2B-6CB8-461E-8965-DFAFE3AAFB5C}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {87550B2B-6CB8-461E-8965-DFAFE3AAFB5C}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {87550B2B-6CB8-461E-8965-DFAFE3AAFB5C}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {87550B2B-6CB8-461E-8965-DFAFE3AAFB5C}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {87550B2B-6CB8-461E-8965-DFAFE3AAFB5C}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {87550B2B-6CB8-461E-8965-DFAFE3AAFB5C}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {87550B2B-6CB8-461E-8965-DFAFE3AAFB5C}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {D8262D40-4880-41E4-91E4-AF8F480C8637}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {D8262D40-4880-41E4-91E4-AF8F480C8637}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {D8262D40-4880-41E4-91E4-AF8F480C8637}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {D8262D40-4880-41E4-91E4-AF8F480C8637}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {D8262D40-4880-41E4-91E4-AF8F480C8637}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {D8262D40-4880-41E4-91E4-AF8F480C8637}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {D8262D40-4880-41E4-91E4-AF8F480C8637}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {D8262D40-4880-41E4-91E4-AF8F480C8637}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {EF879A10-041D-4C68-83E7-3192685F1BAE}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {EF879A10-041D-4C68-83E7-3192685F1BAE}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {EF879A10-041D-4C68-83E7-3192685F1BAE}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {EF879A10-041D-4C68-83E7-3192685F1BAE}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {EF879A10-041D-4C68-83E7-3192685F1BAE}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {EF879A10-041D-4C68-83E7-3192685F1BAE}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {EF879A10-041D-4C68-83E7-3192685F1BAE}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {EF879A10-041D-4C68-83E7-3192685F1BAE}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {B5F435CB-0D8A-40B1-A4F7-5ECB3CE792A9}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {B5F435CB-0D8A-40B1-A4F7-5ECB3CE792A9}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {B5F435CB-0D8A-40B1-A4F7-5ECB3CE792A9}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {B5F435CB-0D8A-40B1-A4F7-5ECB3CE792A9}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {B5F435CB-0D8A-40B1-A4F7-5ECB3CE792A9}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {B5F435CB-0D8A-40B1-A4F7-5ECB3CE792A9}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {B5F435CB-0D8A-40B1-A4F7-5ECB3CE792A9}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {B5F435CB-0D8A-40B1-A4F7-5ECB3CE792A9}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {6E0A079E-85F1-45A1-AD5B-9855E4344809}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {6E0A079E-85F1-45A1-AD5B-9855E4344809}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {6E0A079E-85F1-45A1-AD5B-9855E4344809}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {6E0A079E-85F1-45A1-AD5B-9855E4344809}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {6E0A079E-85F1-45A1-AD5B-9855E4344809}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {6E0A079E-85F1-45A1-AD5B-9855E4344809}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {6E0A079E-85F1-45A1-AD5B-9855E4344809}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {6E0A079E-85F1-45A1-AD5B-9855E4344809}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {C2595B04-856D-40AE-8B99-4804C7A70708}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {C2595B04-856D-40AE-8B99-4804C7A70708}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {C2595B04-856D-40AE-8B99-4804C7A70708}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {C2595B04-856D-40AE-8B99-4804C7A70708}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {C2595B04-856D-40AE-8B99-4804C7A70708}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {C2595B04-856D-40AE-8B99-4804C7A70708}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {C2595B04-856D-40AE-8B99-4804C7A70708}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {C2595B04-856D-40AE-8B99-4804C7A70708}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {CCB6E56B-2DA1-4EBA-A1F9-E8510E129D12}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {CCB6E56B-2DA1-4EBA-A1F9-E8510E129D12}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {CCB6E56B-2DA1-4EBA-A1F9-E8510E129D12}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {CCB6E56B-2DA1-4EBA-A1F9-E8510E129D12}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {CCB6E56B-2DA1-4EBA-A1F9-E8510E129D12}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {CCB6E56B-2DA1-4EBA-A1F9-E8510E129D12}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {CCB6E56B-2DA1-4EBA-A1F9-E8510E129D12}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {CCB6E56B-2DA1-4EBA-A1F9-E8510E129D12}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {C5ADC05B-34E8-47BF-8E78-9C7BF96418C2}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {C5ADC05B-34E8-47BF-8E78-9C7BF96418C2}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {C5ADC05B-34E8-47BF-8E78-9C7BF96418C2}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {C5ADC05B-34E8-47BF-8E78-9C7BF96418C2}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {C5ADC05B-34E8-47BF-8E78-9C7BF96418C2}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {C5ADC05B-34E8-47BF-8E78-9C7BF96418C2}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {C5ADC05B-34E8-47BF-8E78-9C7BF96418C2}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {C5ADC05B-34E8-47BF-8E78-9C7BF96418C2}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {263FA9C1-F81E-4A8E-95E0-8CDAE20F177B}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {263FA9C1-F81E-4A8E-95E0-8CDAE20F177B}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {263FA9C1-F81E-4A8E-95E0-8CDAE20F177B}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {263FA9C1-F81E-4A8E-95E0-8CDAE20F177B}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {263FA9C1-F81E-4A8E-95E0-8CDAE20F177B}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {263FA9C1-F81E-4A8E-95E0-8CDAE20F177B}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {263FA9C1-F81E-4A8E-95E0-8CDAE20F177B}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {263FA9C1-F81E-4A8E-95E0-8CDAE20F177B}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {98692887-B389-4F73-A71A-9FC516738DAB}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {98692887-B389-4F73-A71A-9FC516738DAB}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {98692887-B389-4F73-A71A-9FC516738DAB}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {98692887-B389-4F73-A71A-9FC516738DAB}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {98692887-B389-4F73-A71A-9FC516738DAB}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {98692887-B389-4F73-A71A-9FC516738DAB}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {98692887-B389-4F73-A71A-9FC516738DAB}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {98692887-B389-4F73-A71A-9FC516738DAB}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {5F9AE581-6781-4A4C-A262-1B06CD27208B}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {5F9AE581-6781-4A4C-A262-1B06CD27208B}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {5F9AE581-6781-4A4C-A262-1B06CD27208B}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {5F9AE581-6781-4A4C-A262-1B06CD27208B}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {5F9AE581-6781-4A4C-A262-1B06CD27208B}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {5F9AE581-6781-4A4C-A262-1B06CD27208B}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {5F9AE581-6781-4A4C-A262-1B06CD27208B}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {5F9AE581-6781-4A4C-A262-1B06CD27208B}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {AA782772-FE61-4226-BAA4-EB529FA1646B}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {AA782772-FE61-4226-BAA4-EB529FA1646B}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {AA782772-FE61-4226-BAA4-EB529FA1646B}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {AA782772-FE61-4226-BAA4-EB529FA1646B}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {AA782772-FE61-4226-BAA4-EB529FA1646B}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {AA782772-FE61-4226-BAA4-EB529FA1646B}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {AA782772-FE61-4226-BAA4-EB529FA1646B}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {AA782772-FE61-4226-BAA4-EB529FA1646B}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {47533B7C-0E1A-44A4-8511-B438645F052A}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {47533B7C-0E1A-44A4-8511-B438645F052A}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {47533B7C-0E1A-44A4-8511-B438645F052A}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {47533B7C-0E1A-44A4-8511-B438645F052A}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {47533B7C-0E1A-44A4-8511-B438645F052A}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {47533B7C-0E1A-44A4-8511-B438645F052A}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {47533B7C-0E1A-44A4-8511-B438645F052A}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {47533B7C-0E1A-44A4-8511-B438645F052A}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {C0D6DEE5-5532-4345-9C66-4C00D7FDB8BE}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {C0D6DEE5-5532-4345-9C66-4C00D7FDB8BE}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {C0D6DEE5-5532-4345-9C66-4C00D7FDB8BE}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {C0D6DEE5-5532-4345-9C66-4C00D7FDB8BE}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {C0D6DEE5-5532-4345-9C66-4C00D7FDB8BE}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {C0D6DEE5-5532-4345-9C66-4C00D7FDB8BE}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {C0D6DEE5-5532-4345-9C66-4C00D7FDB8BE}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {C0D6DEE5-5532-4345-9C66-4C00D7FDB8BE}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {133FC760-5699-46D9-BEA6-E816B5F01016}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {133FC760-5699-46D9-BEA6-E816B5F01016}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {133FC760-5699-46D9-BEA6-E816B5F01016}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {133FC760-5699-46D9-BEA6-E816B5F01016}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {133FC760-5699-46D9-BEA6-E816B5F01016}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {133FC760-5699-46D9-BEA6-E816B5F01016}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {133FC760-5699-46D9-BEA6-E816B5F01016}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {133FC760-5699-46D9-BEA6-E816B5F01016}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + {94CF053D-BB66-4FC7-883B-48F072701BA9}.Debug|NET60_Linux.ActiveCfg = Debug|NET60_Linux + {94CF053D-BB66-4FC7-883B-48F072701BA9}.Debug|NET60_Linux.Build.0 = Debug|NET60_Linux + {94CF053D-BB66-4FC7-883B-48F072701BA9}.Debug|NET60_Windows.ActiveCfg = Debug|NET60_Windows + {94CF053D-BB66-4FC7-883B-48F072701BA9}.Debug|NET60_Windows.Build.0 = Debug|NET60_Windows + {94CF053D-BB66-4FC7-883B-48F072701BA9}.Release|NET60_Linux.ActiveCfg = Release|NET60_Linux + {94CF053D-BB66-4FC7-883B-48F072701BA9}.Release|NET60_Linux.Build.0 = Release|NET60_Linux + {94CF053D-BB66-4FC7-883B-48F072701BA9}.Release|NET60_Windows.ActiveCfg = Release|NET60_Windows + {94CF053D-BB66-4FC7-883B-48F072701BA9}.Release|NET60_Windows.Build.0 = Release|NET60_Windows + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {7318D5E5-9D15-4ABE-8A51-92F58D4F0B85} = {A6533823-A64A-441C-B7A2-7B2772F87002} + {7A9E0314-966F-4584-BAA3-7339CBB849D1} = {A6533823-A64A-441C-B7A2-7B2772F87002} + {0D3D43DC-BD7E-46F0-93F7-1C6A6CC79948} = {A6533823-A64A-441C-B7A2-7B2772F87002} + {A4794476-7D0E-41C0-AD83-4AB929C0A46C} = {A6533823-A64A-441C-B7A2-7B2772F87002} + {87550B2B-6CB8-461E-8965-DFAFE3AAFB5C} = {FA7BE306-A3B0-45FA-9D87-0C69E6932C13} + {D8262D40-4880-41E4-91E4-AF8F480C8637} = {FA7BE306-A3B0-45FA-9D87-0C69E6932C13} + {6E0A079E-85F1-45A1-AD5B-9855E4344809} = {FA7BE306-A3B0-45FA-9D87-0C69E6932C13} + {C2595B04-856D-40AE-8B99-4804C7A70708} = {A6533823-A64A-441C-B7A2-7B2772F87002} + {CCB6E56B-2DA1-4EBA-A1F9-E8510E129D12} = {FA7BE306-A3B0-45FA-9D87-0C69E6932C13} + {C5ADC05B-34E8-47BF-8E78-9C7BF96418C2} = {FA7BE306-A3B0-45FA-9D87-0C69E6932C13} + {263FA9C1-F81E-4A8E-95E0-8CDAE20F177B} = {D114C59C-CF66-4CC2-980F-9301FB4EA4E1} + {98692887-B389-4F73-A71A-9FC516738DAB} = {D114C59C-CF66-4CC2-980F-9301FB4EA4E1} + {47533B7C-0E1A-44A4-8511-B438645F052A} = {88D45B00-E564-41DB-B57C-9509646CAA49} + {C0D6DEE5-5532-4345-9C66-4C00D7FDB8BE} = {FA7BE306-A3B0-45FA-9D87-0C69E6932C13} + {94CF053D-BB66-4FC7-883B-48F072701BA9} = {D114C59C-CF66-4CC2-980F-9301FB4EA4E1} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {89CB19C6-BF0A-4E6A-BFDA-79D143EAB59D} + EndGlobalSection +EndGlobal diff --git a/src/DynamoCore/Configuration/PathManager.cs b/src/DynamoCore/Configuration/PathManager.cs index e1f9d4a2b65..efc079d6090 100644 --- a/src/DynamoCore/Configuration/PathManager.cs +++ b/src/DynamoCore/Configuration/PathManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; diff --git a/src/DynamoCore/Core/NodeModelAssemblyLoader.cs b/src/DynamoCore/Core/NodeModelAssemblyLoader.cs index 99c96fca888..1a9244cbfee 100644 --- a/src/DynamoCore/Core/NodeModelAssemblyLoader.cs +++ b/src/DynamoCore/Core/NodeModelAssemblyLoader.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -7,7 +7,6 @@ using Dynamo.Graph.Nodes; using Dynamo.Logging; using Dynamo.Migration; -using Dynamo.Utilities; namespace Dynamo.Models { @@ -218,7 +217,7 @@ internal static IEnumerable GetCustomizationTypesUsingReflection(Assembly var customizerType = Type.GetType("Dynamo.Wpf.INodeViewCustomization`1,DynamoCoreWpf"); if (customizerType != null) { - output = assem.GetTypes().Where(t => !t.IsAbstract && TypeExtensions.ImplementsGeneric(customizerType, t)); + output = assem.GetTypes().Where(t => !t.IsAbstract && Utilities.TypeExtensions.ImplementsGeneric(customizerType, t)); return output; } } diff --git a/src/DynamoCore/DynamoCore.csproj b/src/DynamoCore/DynamoCore.csproj index 7d70e872d47..1bfd00826d8 100644 --- a/src/DynamoCore/DynamoCore.csproj +++ b/src/DynamoCore/DynamoCore.csproj @@ -17,10 +17,16 @@ - + + + + + + + - + @@ -28,7 +34,6 @@ - @@ -159,29 +164,25 @@ --> - + - - - - - + - + - + \ No newline at end of file diff --git a/src/DynamoCore/Logging/DynamoAnalyticsClient.cs b/src/DynamoCore/Logging/DynamoAnalyticsClient.cs index 157397c87a5..2d3e37c367d 100644 --- a/src/DynamoCore/Logging/DynamoAnalyticsClient.cs +++ b/src/DynamoCore/Logging/DynamoAnalyticsClient.cs @@ -1,6 +1,5 @@ -using System; +using System; using System.Diagnostics; -using Autodesk.Analytics.Google; using Autodesk.Analytics.ADP; using Autodesk.Analytics.Core; using Autodesk.Analytics.Events; @@ -179,15 +178,18 @@ public DynamoAnalyticsClient(DynamoModel dynamoModel) product = new ProductInfo() { Id = "DYN", Name = hostName, VersionString = appversion, AppVersion = appversion, BuildId = buildId, ReleaseId = releaseId }; } + // TODO: Google analytics can be made available on dotnet6-windows (windows only) private void RegisterGATracker(Service service) { +#if NET48 //Some clients such as Revit may allow start/close Dynamo multiple times //in the same session so register only if the factory is not registered. - if (service.GetTrackerFactory(GATrackerFactory.Name) == null) + if (service.GetTrackerFactory(Autodesk.Analytics.Google.GATrackerFactory.Name) == null) { - service.Register(new GATrackerFactory(ANALYTICS_PROPERTY)); - service.AddTrackerFactoryFilter(GATrackerFactory.Name, () => ReportingGoogleAnalytics); + service.Register(new Autodesk.Analytics.Google.GATrackerFactory(ANALYTICS_PROPERTY)); + service.AddTrackerFactoryFilter(Autodesk.Analytics.Google.GATrackerFactory.Name, () => ReportingGoogleAnalytics); } +#endif } private void RegisterADPTracker(Service service) @@ -369,4 +371,4 @@ public void Dispose() } } } -} \ No newline at end of file +} diff --git a/src/DynamoCoreWpf/DynamoCoreWpf.csproj b/src/DynamoCoreWpf/DynamoCoreWpf.csproj index 15840a9019f..37eae248cc7 100644 --- a/src/DynamoCoreWpf/DynamoCoreWpf.csproj +++ b/src/DynamoCoreWpf/DynamoCoreWpf.csproj @@ -69,6 +69,7 @@ + diff --git a/src/DynamoPackages/DynamoPackages.csproj b/src/DynamoPackages/DynamoPackages.csproj index 072e717d141..1360c6ba42d 100644 --- a/src/DynamoPackages/DynamoPackages.csproj +++ b/src/DynamoPackages/DynamoPackages.csproj @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ DynamoPackages DynamoPackages - + diff --git a/src/DynamoPackages/PackageLoader.cs b/src/DynamoPackages/PackageLoader.cs index 66df796c3e2..cd53a3ec77d 100644 --- a/src/DynamoPackages/PackageLoader.cs +++ b/src/DynamoPackages/PackageLoader.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -724,7 +724,10 @@ private static void CheckPackageNodeLibraryCertificates(string packageDirectoryP var filepath = Path.Combine(discoveredPkg.BinaryDirectory, filename); try { - CertificateVerification.CheckAssemblyForValidCertificate(filepath); + if (OSHelper.IsWindows()) + { + CertificateVerification.CheckAssemblyForValidCertificate(filepath); + } } catch (Exception e) { diff --git a/src/DynamoUtilities/CertificateVerification.cs b/src/DynamoUtilities/CertificateVerification.cs index dd191ab5ce3..0236b089bab 100644 --- a/src/DynamoUtilities/CertificateVerification.cs +++ b/src/DynamoUtilities/CertificateVerification.cs @@ -1,15 +1,19 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; +using System.Runtime.Versioning; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; namespace DynamoUtilities { +#if NET6_0_OR_GREATER + [SupportedOSPlatform("Windows")] +#endif internal sealed class WinTrustInterop { #region WinTrustData struct field enums @@ -152,6 +156,9 @@ enum WinVerifyTrustResult : uint UntrustedRoot = 0x800B0109 // CERT_E_UNTRUSTEDROOT - A certification chain processed correctly but terminated in a root certificate that is not trusted by the trust provider. } +#if NET6_0_OR_GREATER + [SupportedOSPlatform("Windows")] +#endif public class WinTrust { private static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); @@ -165,6 +172,9 @@ [In] [MarshalAs(UnmanagedType.LPStruct)] Guid pgActionID, [In] WinTrustData pWVTData ); +#if NET6_0_OR_GREATER + [SupportedOSPlatform("Windows")] +#endif // call WinTrust.WinVerifyTrust() to check embedded file signature public static bool VerifyEmbeddedSignature(string fileName) { @@ -191,6 +201,9 @@ private WinTrust() { } } } +#if NET6_0_OR_GREATER + [SupportedOSPlatform("Windows")] +#endif public class CertificateVerification { /// diff --git a/src/DynamoUtilities/DynamoUtilities.csproj b/src/DynamoUtilities/DynamoUtilities.csproj index 45a41699dca..794a59fc366 100644 --- a/src/DynamoUtilities/DynamoUtilities.csproj +++ b/src/DynamoUtilities/DynamoUtilities.csproj @@ -1,4 +1,4 @@ - + @@ -11,9 +11,22 @@ DynamoUtilities DynamoUtilities - - - + + + + + + + + + + + true + none + + + $(PkgSystem_Collections_Immutable)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + diff --git a/src/DynamoUtilities/EnumerableExtensions.cs b/src/DynamoUtilities/EnumerableExtensions.cs index 2e091e9f650..8ec1fc58182 100644 --- a/src/DynamoUtilities/EnumerableExtensions.cs +++ b/src/DynamoUtilities/EnumerableExtensions.cs @@ -1,10 +1,10 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; +using System.Collections.Immutable; using System.Collections.ObjectModel; using System.Linq; using System.Xml; -using ICSharpCode.AvalonEdit.Utils; namespace Dynamo.Utilities { diff --git a/src/DynamoUtilities/PathHelper.cs b/src/DynamoUtilities/PathHelper.cs index 37b585e3a09..08927dfbeb6 100644 --- a/src/DynamoUtilities/PathHelper.cs +++ b/src/DynamoUtilities/PathHelper.cs @@ -1,9 +1,8 @@ using System; -using System.Collections; -using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; +using System.Runtime.Versioning; using System.Security.AccessControl; using System.Security.Principal; using System.Xml; @@ -11,6 +10,21 @@ namespace DynamoUtilities { + internal static class OSHelper + { +#if NET6_0_OR_GREATER + [SupportedOSPlatformGuard("windows")] +#endif + public static bool IsWindows() + { +#if NET6_0_OR_GREATER + return OperatingSystem.IsWindows(); +#else + return true;// net48, assuming we will no deliver net48 on anything else but windows (also no more mono builds) +#endif + + } + } public class PathHelper { private static readonly string sizeUnits = " KB"; @@ -61,7 +75,10 @@ public static bool IsReadOnlyPath(string filePath) // We mark the path read only when // 1. file read-only // 2. user does not have write access to the folder - return Finfo.IsReadOnly || !HasWritePermissionOnDir(Finfo.Directory.ToString()); + + // We have no cross platform Directory access writes APIs. + bool hasWritePermissionOnDir = OSHelper.IsWindows() ? HasWritePermissionOnDir(Finfo.Directory.ToString()) : true; + return Finfo.IsReadOnly || !hasWritePermissionOnDir; } else return false; @@ -72,13 +89,19 @@ public static bool IsReadOnlyPath(string filePath) /// /// Folder path /// +#if NET6_0_OR_GREATER + [SupportedOSPlatform("windows")] +#endif public static bool HasWritePermissionOnDir(string folderPath) { try { var writeAllow = false; var writeDeny = false; - var accessControlList = Directory.GetAccessControl(folderPath); + DirectoryInfo dInfo = new DirectoryInfo(folderPath); + if (dInfo == null) + return false; + var accessControlList = dInfo.GetAccessControl(); if (accessControlList == null) return false; var accessRules = accessControlList.GetAccessRules(true, true, @@ -100,7 +123,7 @@ public static bool HasWritePermissionOnDir(string folderPath) return writeAllow && !writeDeny; } - catch(Exception) + catch (Exception) { return false; } @@ -111,13 +134,20 @@ public static bool HasWritePermissionOnDir(string folderPath) /// /// Folder path /// +#if NET6_0_OR_GREATER + [SupportedOSPlatform("windows")] +#endif internal static bool HasReadPermissionOnDir(string folderPath) { try { var readAllow = false; var readDeny = false; - var accessControlList = Directory.GetAccessControl(folderPath); + + DirectoryInfo dInfo = new DirectoryInfo(folderPath); + if (dInfo == null) + return false; + var accessControlList = dInfo.GetAccessControl(); if (accessControlList == null) return false; @@ -136,7 +166,7 @@ internal static bool HasReadPermissionOnDir(string folderPath) if (!curentUser.User.Equals(rule.IdentityReference) && !curentUser.Groups.Contains(rule.IdentityReference)) continue; - + if (rule.AccessControlType == AccessControlType.Allow) readAllow = true; else if (rule.AccessControlType == AccessControlType.Deny) @@ -168,7 +198,7 @@ public static bool isValidXML(string path, out XmlDocument xmlDoc, out Exception ex = null; return true; } - catch(Exception e) + catch (Exception e) { xmlDoc = null; ex = e; @@ -189,7 +219,7 @@ public static bool isFileContentsValidJson(string fileContents, out Exception ex ex = new JsonReaderException(); return false; } - + try { fileContents = fileContents.Trim(); @@ -199,16 +229,16 @@ public static bool isFileContentsValidJson(string fileContents, out Exception ex var obj = Newtonsoft.Json.Linq.JToken.Parse(fileContents); return true; } - else + else { ex = new JsonReaderException(); } } - catch(Exception e) + catch (Exception e) { ex = e; } - + return false; } @@ -339,14 +369,18 @@ internal static string ValidateDirectory(string directoryPath, bool absolutePath throw new DirectoryNotFoundException($"The input path: {directoryPath} does not exist or is not a folder"); } - if (read && !PathHelper.HasReadPermissionOnDir(directoryPath)) + // TODO: figure out read/write permissions for Linux + if (OSHelper.IsWindows()) { - throw new System.Security.SecurityException($"Dynamo does not have the required permissions for the path: {directoryPath}"); - } + if (read && !PathHelper.HasReadPermissionOnDir(directoryPath)) + { + throw new System.Security.SecurityException($"Dynamo does not have the required permissions for the path: {directoryPath}"); + } - if (write && !PathHelper.HasWritePermissionOnDir(directoryPath)) - { - throw new System.Security.SecurityException($"Dynamo does not have the required permissions for the path: {directoryPath}"); + if (write && !PathHelper.HasWritePermissionOnDir(directoryPath)) + { + throw new System.Security.SecurityException($"Dynamo does not have the required permissions for the path: {directoryPath}"); + } } return directoryPath; @@ -388,7 +422,7 @@ internal static bool IsSubDirectoryOfDirectory(string subdirectory, string direc { string subdirPath = FormatDirectoryPath(subdirectory); string directoryPath = FormatDirectoryPath(directory); - + return subdirPath.StartsWith(directoryPath, StringComparison.OrdinalIgnoreCase); } diff --git a/src/DynamoUtilities/Properties/AssemblyInfo.cs b/src/DynamoUtilities/Properties/AssemblyInfo.cs index 279839de1bb..c3981334ac4 100644 --- a/src/DynamoUtilities/Properties/AssemblyInfo.cs +++ b/src/DynamoUtilities/Properties/AssemblyInfo.cs @@ -21,4 +21,6 @@ [assembly: InternalsVisibleTo("DynamoPackages")] [assembly: InternalsVisibleTo("ProtoScript")] [assembly: InternalsVisibleTo("ProtoCore")] +[assembly: InternalsVisibleTo("DynamoApplications")] +[assembly: InternalsVisibleTo("DynamoCLI")] [assembly: InternalsVisibleTo("NodeDocumentationMarkdownGenerator")] diff --git a/src/Engine/ProtoCore/ProtoCore.csproj b/src/Engine/ProtoCore/ProtoCore.csproj index e3f7e204682..30d7c5c966b 100644 --- a/src/Engine/ProtoCore/ProtoCore.csproj +++ b/src/Engine/ProtoCore/ProtoCore.csproj @@ -1,4 +1,4 @@ - + @@ -12,7 +12,7 @@ false ProtoCore.snk - + CS3008, CS3003 @@ -20,13 +20,22 @@ - + + + + + + + + + + - + diff --git a/src/Libraries/CoreNodeModels/CoreNodeModels.csproj b/src/Libraries/CoreNodeModels/CoreNodeModels.csproj index 87882b64ced..fd074618fb2 100644 --- a/src/Libraries/CoreNodeModels/CoreNodeModels.csproj +++ b/src/Libraries/CoreNodeModels/CoreNodeModels.csproj @@ -20,14 +20,18 @@ + + + true + + runtime + + + + + + - - true - - runtime - - - {7858fa8c-475f-4b8e-b468-1f8200778cf8} DynamoCore @@ -86,20 +90,16 @@ Resources.en-US.Designer.cs - + - - - - - + - + \ No newline at end of file diff --git a/src/Libraries/CoreNodes/CoreNodes.csproj b/src/Libraries/CoreNodes/CoreNodes.csproj index 73671efd6ef..07dc7f1465e 100644 --- a/src/Libraries/CoreNodes/CoreNodes.csproj +++ b/src/Libraries/CoreNodes/CoreNodes.csproj @@ -15,7 +15,7 @@ - + @@ -23,6 +23,14 @@ runtime + + + + + + + + {7858fa8c-475f-4b8e-b468-1f8200778cf8} DynamoCore @@ -81,20 +89,16 @@ Resources.en-US.Designer.cs - + - - - - - + \ No newline at end of file diff --git a/src/Libraries/CoreNodes/FileSystem.cs b/src/Libraries/CoreNodes/FileSystem.cs index 285b94426f2..0681b1ee302 100644 --- a/src/Libraries/CoreNodes/FileSystem.cs +++ b/src/Libraries/CoreNodes/FileSystem.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; @@ -7,6 +7,7 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices; +using System.Runtime.Versioning; using Autodesk.DesignScript.Runtime; using Dynamo.Events; using Dynamo.Graph.Nodes; @@ -336,7 +337,9 @@ public static void MoveDirectory(string path, string newPath, bool overwriteFile #region Obsolete Methods - +#if NET6_0_OR_GREATER + [SupportedOSPlatform("windows")] +#endif [NodeObsolete("ReadImageObsolete", typeof(Properties.Resources))] public static Color[] ReadImage(string path, int xSamples, int ySamples) { @@ -345,6 +348,9 @@ public static Color[] ReadImage(string path, int xSamples, int ySamples) return Image.Pixels(image, xSamples, ySamples).SelectMany(x => x).ToArray(); } +#if NET6_0_OR_GREATER + [SupportedOSPlatform("windows")] +#endif [NodeObsolete("LoadImageFromPathObsolete", typeof(Properties.Resources))] public static Bitmap LoadImageFromPath(string path) { @@ -357,6 +363,9 @@ public static string ReadText(string path) return ReadText(FileFromPath(path)); } +#if NET6_0_OR_GREATER + [SupportedOSPlatform("windows")] +#endif [NodeObsolete("WriteImageObsolete", typeof(Properties.Resources))] public static bool WriteImage(string filePath, string fileName, Bitmap image) { @@ -376,6 +385,9 @@ public static bool ExportToCSV(string filePath, object[][] data) /// /// Methods for operating on Image Bitmaps. /// +#if NET6_0_OR_GREATER + [SupportedOSPlatform("windows")] +#endif public static class Image { /// diff --git a/src/Libraries/DesignScriptBuiltin/DesignScriptBuiltin.csproj b/src/Libraries/DesignScriptBuiltin/DesignScriptBuiltin.csproj index 389d156ae27..486d8da720c 100644 --- a/src/Libraries/DesignScriptBuiltin/DesignScriptBuiltin.csproj +++ b/src/Libraries/DesignScriptBuiltin/DesignScriptBuiltin.csproj @@ -1,4 +1,4 @@ - + @@ -10,7 +10,7 @@ DesignScriptBuiltin $(OutputPath)\$(UICulture)\DesignScriptBuiltin.xml - + true none @@ -19,6 +19,10 @@ $(PkgSystem_Collections_Immutable)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + + + + {ef879a10-041d-4c68-83e7-3192685f1bae} @@ -47,17 +51,13 @@ Resources.en-US.Designer.cs - - - - - + - + \ No newline at end of file diff --git a/src/Libraries/DynamoConversions/DynamoConversions.csproj b/src/Libraries/DynamoConversions/DynamoConversions.csproj index c8020736dd0..16df5b45c1c 100644 --- a/src/Libraries/DynamoConversions/DynamoConversions.csproj +++ b/src/Libraries/DynamoConversions/DynamoConversions.csproj @@ -1,4 +1,4 @@ - + diff --git a/src/Libraries/DynamoUnits/Quantity.cs b/src/Libraries/DynamoUnits/Quantity.cs index adb42e2e293..7fd5479b558 100644 --- a/src/Libraries/DynamoUnits/Quantity.cs +++ b/src/Libraries/DynamoUnits/Quantity.cs @@ -1,6 +1,9 @@ -using System; +using System; using System.Collections.Generic; using Autodesk.DesignScript.Runtime; +#if NET6_0_OR_GREATER +using ForgeUnitsCLR = Autodesk.ForgeUnits; +#endif namespace DynamoUnits { diff --git a/src/Libraries/DynamoUnits/Symbol.cs b/src/Libraries/DynamoUnits/Symbol.cs index cc252df5891..acfa69bf3dc 100644 --- a/src/Libraries/DynamoUnits/Symbol.cs +++ b/src/Libraries/DynamoUnits/Symbol.cs @@ -1,8 +1,12 @@ -using System; +using System; using System.Collections.Generic; using System.Text; using Autodesk.DesignScript.Runtime; +#if NET6_0_OR_GREATER +using ForgeUnitsCLR = Autodesk.ForgeUnits; +#endif + namespace DynamoUnits { /// diff --git a/src/Libraries/DynamoUnits/Unit.cs b/src/Libraries/DynamoUnits/Unit.cs index 089287f2ae8..cc0ec9677e9 100644 --- a/src/Libraries/DynamoUnits/Unit.cs +++ b/src/Libraries/DynamoUnits/Unit.cs @@ -1,6 +1,9 @@ -using System; +using System; using System.Collections.Generic; using Autodesk.DesignScript.Runtime; +#if NET6_0_OR_GREATER +using ForgeUnitsCLR = Autodesk.ForgeUnits; +#endif namespace DynamoUnits { diff --git a/src/Libraries/DynamoUnits/Units.csproj b/src/Libraries/DynamoUnits/Units.csproj index a23a4ebd09a..db97b715d14 100644 --- a/src/Libraries/DynamoUnits/Units.csproj +++ b/src/Libraries/DynamoUnits/Units.csproj @@ -10,10 +10,18 @@ DynamoUnits $(OutputPath)\DynamoUnits.xml - + - - + + + + + + + + build + + @@ -68,17 +76,13 @@ - - - - - + - + diff --git a/src/Libraries/DynamoUnits/Utilities.cs b/src/Libraries/DynamoUnits/Utilities.cs index 97158afc2c4..651befda698 100644 --- a/src/Libraries/DynamoUnits/Utilities.cs +++ b/src/Libraries/DynamoUnits/Utilities.cs @@ -1,11 +1,15 @@ -using System; +using System; using System.Collections.Generic; -using System.Linq; using Autodesk.DesignScript.Runtime; using System.Reflection; using System.IO; using System.Configuration; +#if NET6_0_OR_GREATER +using ForgeUnitsCLR = Autodesk.ForgeUnits; +using SchemasCLR = Autodesk.ForgeUnits; +#endif + namespace DynamoUnits { /// diff --git a/src/Tools/DynamoInstallDetective/DynamoInstallDetective.csproj b/src/Tools/DynamoInstallDetective/DynamoInstallDetective.csproj index 5a0835a9cbe..63f6d7c06e6 100644 --- a/src/Tools/DynamoInstallDetective/DynamoInstallDetective.csproj +++ b/src/Tools/DynamoInstallDetective/DynamoInstallDetective.csproj @@ -9,7 +9,11 @@ DynamoInstallDetective DynamoInstallDetective - - + + + + + + \ No newline at end of file diff --git a/src/Tools/DynamoInstallDetective/ProductLookUp.cs b/src/Tools/DynamoInstallDetective/ProductLookUp.cs index 9ea45de99b4..fb502c03f5e 100644 --- a/src/Tools/DynamoInstallDetective/ProductLookUp.cs +++ b/src/Tools/DynamoInstallDetective/ProductLookUp.cs @@ -1,15 +1,19 @@ -using System; +using System; using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.Versioning; using Microsoft.Win32; namespace DynamoInstallDetective { // Utility class for interacting with the windows registry. +#if NET6_0_OR_GREATER + [SupportedOSPlatform("windows")] +#endif internal static class RegUtils { // Utility class to enable/disable registry caching within a scope. @@ -228,6 +232,9 @@ public interface IProductCollection /// /// Implements basic look up algorithm to get product installations using registry keys /// +#if NET6_0_OR_GREATER + [SupportedOSPlatform("windows")] +#endif public class InstalledProductLookUp : IProductLookUp { /// @@ -341,6 +348,9 @@ public virtual Tuple GetVersionInfoFromFile(string filePath) } } +#if NET6_0_OR_GREATER + [SupportedOSPlatform("windows")] +#endif class InstalledProduct : IInstalledProduct { public string ProductName { get; set; } @@ -386,6 +396,9 @@ public override int GetHashCode() } } +#if NET6_0_OR_GREATER + [SupportedOSPlatform("windows")] +#endif public class InstalledProducts : IProductCollection { public IEnumerable Products { get; protected set; } @@ -416,7 +429,9 @@ public virtual void LookUpAndInitProducts(IProductLookUp lookUp) } } - +#if NET6_0_OR_GREATER + [SupportedOSPlatform("windows")] +#endif public class DynamoProducts : InstalledProducts { const string PRODUCT_ID07_X = @"{6B5FA6CA-9D69-46CF-B517-1F90C64F7C0B}"; diff --git a/src/Tools/DynamoInstallDetective/Utilities.cs b/src/Tools/DynamoInstallDetective/Utilities.cs index 9e42d2fc914..a4f5fe3e729 100644 --- a/src/Tools/DynamoInstallDetective/Utilities.cs +++ b/src/Tools/DynamoInstallDetective/Utilities.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using System.Linq; @@ -9,6 +9,9 @@ namespace DynamoInstallDetective /// /// Utility class for install detective /// +#if NET6_0_OR_GREATER + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif public static class Utilities { /// diff --git a/src/Tools/DynamoShapeManager/DynamoShapeManager.csproj b/src/Tools/DynamoShapeManager/DynamoShapeManager.csproj index 1fe52b1e729..af43bb8f5d2 100644 --- a/src/Tools/DynamoShapeManager/DynamoShapeManager.csproj +++ b/src/Tools/DynamoShapeManager/DynamoShapeManager.csproj @@ -1,4 +1,4 @@ - + @@ -9,7 +9,10 @@ DynamoShapeManager DynamoShapeManager - - + + + + + \ No newline at end of file diff --git a/src/Tools/DynamoShapeManager/Preloader.cs b/src/Tools/DynamoShapeManager/Preloader.cs index b755ea9a0f2..426d34821dc 100644 --- a/src/Tools/DynamoShapeManager/Preloader.cs +++ b/src/Tools/DynamoShapeManager/Preloader.cs @@ -52,7 +52,9 @@ public class Preloader /// typical setup this would be the same directory that contains Dynamo /// core modules. This must represent a valid directory. /// - /// +#if NET6_0_OR_GREATER + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif public Preloader(string rootFolder) : this(rootFolder, new[] { @@ -99,7 +101,9 @@ internal static Version MapLibGVersionEnumToFullVersion(LibraryVersion libVersio /// /// A list of version numbers to check for in order /// of preference. This argument cannot be null or empty. - /// +#if NET6_0_OR_GREATER + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif [Obsolete("please use constructor Preloader constructor with signature Preloader(string,IEnumerable)")] public Preloader(string rootFolder, IEnumerable versions) : this(rootFolder, versions.Select(libVersion => MapLibGVersionEnumToFullVersion(libVersion))) @@ -118,7 +122,9 @@ public Preloader(string rootFolder, IEnumerable versions) : /// /// A list of version numbers to check for in order /// of preference. This argument cannot be null or empty. - /// +#if NET6_0_OR_GREATER + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif public Preloader(string rootFolder, IEnumerable versions) { if (string.IsNullOrEmpty(rootFolder)) @@ -187,6 +193,9 @@ public Preloader(string rootFolder, string shapeManagerPath, LibraryVersion vers /// The version of shape manager. /// [Obsolete("please use constructor Preloader constructor with signature Preloader(string,IEnumerable)")] +#if NET6_0_OR_GREATER + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif public Preloader(string rootFolder, LibraryVersion version) : this(rootFolder, new[] { version }) { } diff --git a/src/Tools/DynamoShapeManager/Utilities.cs b/src/Tools/DynamoShapeManager/Utilities.cs index b0214890ea6..181e7eb21aa 100644 --- a/src/Tools/DynamoShapeManager/Utilities.cs +++ b/src/Tools/DynamoShapeManager/Utilities.cs @@ -174,6 +174,9 @@ private static List ProductsWithASM /// or None otherwise. /// [Obsolete("Please use version of this method which accepts precise collection of version objects.")] +#if NET6_0_OR_GREATER + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif public static LibraryVersion GetInstalledAsmVersion(List versions, ref string location, string rootFolder) { if (string.IsNullOrEmpty(rootFolder)) @@ -248,7 +251,9 @@ public static LibraryVersion GetInstalledAsmVersion(List version /// of Tuples - these represent versions of ASM which are located on the user's machine. /// Returns System.Version of ASM if any installed ASM is found, /// or null otherwise. - /// +#if NET6_0_OR_GREATER + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif public static Version GetInstalledAsmVersion2(IEnumerable versions, ref string location, string rootFolder, Func getASMInstallsFunc = null) { if (string.IsNullOrEmpty(rootFolder)) @@ -553,6 +558,9 @@ public static string GetGeometryFactoryPath2(string rootFolder, Version version) } +#if NET6_0_OR_GREATER + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif private static IEnumerable GetAsmInstallations(string rootFolder) { var assemblyPath = Path.Combine(Path.Combine(rootFolder, "DynamoInstallDetective.dll")); @@ -588,6 +596,9 @@ private static IEnumerable GetAsmInstallations(string rootFolder) /// Files found on an ASM installation location. /// Major version of ASM found in the specified location. /// Whether the files represent a complete ASM installation or not. +#if NET6_0_OR_GREATER + [System.Runtime.Versioning.SupportedOSPlatform("windows")] +#endif internal static bool IsASMInstallationComplete(IEnumerable filePaths, int majorVersion) { var fileNames = filePaths.Select(path => Path.GetFileName(path).ToUpper()); @@ -611,11 +622,28 @@ internal static bool IsASMInstallationComplete(IEnumerable filePaths, in /// /// optional - to be used for testing - default is the ASM search pattern /// - public static Version GetVersionFromPath(string asmPath, string searchPattern = "ASMAHL*.dll") + public static Version GetVersionFromPath(string asmPath, string searchPattern = "*ASMAHL*.*") { var ASMFilePath = Directory.GetFiles(asmPath, searchPattern, SearchOption.TopDirectoryOnly).FirstOrDefault(); if (ASMFilePath != null && File.Exists(ASMFilePath)) { +#if NET6_0_OR_GREATER + if (!OperatingSystem.IsWindows()) + { + string fileName = Path.GetFileNameWithoutExtension(ASMFilePath); + + var version = new string(fileName + .SkipWhile(c => !char.IsDigit(c)) + .TakeWhile(c => char.IsDigit(c)) + .Take(3).ToArray()); + + if (string.IsNullOrEmpty(version)) + { + throw new Exception($"Cannot extract ASM version. Bad version format found for file {fileName}"); + } + return new Version($"{version}.0.0"); + } +#endif var asmVersion = FileVersionInfo.GetVersionInfo(ASMFilePath); var libGversion = new Version(asmVersion.FileMajorPart, asmVersion.FileMinorPart, asmVersion.FileBuildPart); return libGversion;