diff --git a/.gitmodules b/.gitmodules
index 2d11fdfa9e..032bc879cc 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,3 +4,6 @@
[submodule "src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github"]
path = src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github
url = https://github.com/kekekeks/XamlX.git
+[submodule "nukebuild/il-repack"]
+ path = nukebuild/il-repack
+ url = https://github.com/Gillibald/il-repack
diff --git a/.nuke b/.nuke
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/.nuke/build.schema.json b/.nuke/build.schema.json
new file mode 100644
index 0000000000..5bbc3d6915
--- /dev/null
+++ b/.nuke/build.schema.json
@@ -0,0 +1,148 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Build Schema",
+ "$ref": "#/definitions/build",
+ "definitions": {
+ "build": {
+ "type": "object",
+ "properties": {
+ "Configuration": {
+ "type": "string",
+ "description": "configuration"
+ },
+ "Continue": {
+ "type": "boolean",
+ "description": "Indicates to continue a previously failed build attempt"
+ },
+ "ForceNugetVersion": {
+ "type": "string",
+ "description": "force-nuget-version"
+ },
+ "Help": {
+ "type": "boolean",
+ "description": "Shows the help text for this build assembly"
+ },
+ "Host": {
+ "type": "string",
+ "description": "Host for execution. Default is 'automatic'",
+ "enum": [
+ "AppVeyor",
+ "AzurePipelines",
+ "Bamboo",
+ "Bitbucket",
+ "Bitrise",
+ "GitHubActions",
+ "GitLab",
+ "Jenkins",
+ "Rider",
+ "SpaceAutomation",
+ "TeamCity",
+ "Terminal",
+ "TravisCI",
+ "VisualStudio",
+ "VSCode"
+ ]
+ },
+ "NoLogo": {
+ "type": "boolean",
+ "description": "Disables displaying the NUKE logo"
+ },
+ "Partition": {
+ "type": "string",
+ "description": "Partition to use on CI"
+ },
+ "Plan": {
+ "type": "boolean",
+ "description": "Shows the execution plan (HTML)"
+ },
+ "Profile": {
+ "type": "array",
+ "description": "Defines the profiles to load",
+ "items": {
+ "type": "string"
+ }
+ },
+ "Root": {
+ "type": "string",
+ "description": "Root directory during build execution"
+ },
+ "Skip": {
+ "type": "array",
+ "description": "List of targets to be skipped. Empty list skips all dependencies",
+ "items": {
+ "type": "string",
+ "enum": [
+ "CiAzureLinux",
+ "CiAzureOSX",
+ "CiAzureWindows",
+ "Clean",
+ "Compile",
+ "CompileHtmlPreviewer",
+ "CompileNative",
+ "CreateIntermediateNugetPackages",
+ "CreateNugetPackages",
+ "GenerateCppHeaders",
+ "Package",
+ "RunCoreLibsTests",
+ "RunDesignerTests",
+ "RunHtmlPreviewerTests",
+ "RunLeakTests",
+ "RunRenderTests",
+ "RunTests",
+ "ZipFiles"
+ ]
+ }
+ },
+ "SkipPreviewer": {
+ "type": "boolean",
+ "description": "skip-previewer"
+ },
+ "SkipTests": {
+ "type": "boolean",
+ "description": "skip-tests"
+ },
+ "Solution": {
+ "type": "string",
+ "description": "Path to a solution file that is automatically loaded. Default is Avalonia.sln"
+ },
+ "Target": {
+ "type": "array",
+ "description": "List of targets to be invoked. Default is '{default_target}'",
+ "items": {
+ "type": "string",
+ "enum": [
+ "CiAzureLinux",
+ "CiAzureOSX",
+ "CiAzureWindows",
+ "Clean",
+ "Compile",
+ "CompileHtmlPreviewer",
+ "CompileNative",
+ "CreateIntermediateNugetPackages",
+ "CreateNugetPackages",
+ "GenerateCppHeaders",
+ "Package",
+ "RunCoreLibsTests",
+ "RunDesignerTests",
+ "RunHtmlPreviewerTests",
+ "RunLeakTests",
+ "RunRenderTests",
+ "RunTests",
+ "ZipFiles"
+ ]
+ }
+ },
+ "Verbosity": {
+ "type": "string",
+ "description": "Logging verbosity during build execution. Default is 'Normal'",
+ "enum": [
+ "Minimal",
+ "Normal",
+ "Quiet",
+ "Verbose"
+ ]
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/.nuke/parameters.json b/.nuke/parameters.json
new file mode 100644
index 0000000000..42521bb7dd
--- /dev/null
+++ b/.nuke/parameters.json
@@ -0,0 +1,4 @@
+{
+ "$schema": "./build.schema.json",
+ "Solution": ""
+}
\ No newline at end of file
diff --git a/azure-pipelines-integrationtests.yml b/azure-pipelines-integrationtests.yml
index 0b79758c76..99983b1758 100644
--- a/azure-pipelines-integrationtests.yml
+++ b/azure-pipelines-integrationtests.yml
@@ -41,9 +41,9 @@ jobs:
steps:
- task: UseDotNet@2
- displayName: 'Use .NET Core SDK 6.0.202'
+ displayName: 'Use .NET Core SDK 6.0.401'
inputs:
- version: 6.0.202
+ version: 6.0.401
- task: Windows Application Driver@0
inputs:
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 8dbe304d7e..8804bc02e1 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -29,27 +29,11 @@ jobs:
pool:
vmImage: 'ubuntu-20.04'
steps:
- - task: UseDotNet@2
- displayName: 'Use .NET Core SDK 3.1.418'
- inputs:
- version: 3.1.418
-
- task: UseDotNet@2
displayName: 'Use .NET Core SDK 6.0.401'
inputs:
version: 6.0.401
- - task: UseDotNet@2
- displayName: 'Use .NET Core SDK 7.0.100-rc.1.22431.12'
- inputs:
- version: 7.0.100-rc.1.22431.12
-
- - task: CmdLine@2
- displayName: 'Install Workloads'
- inputs:
- script: |
- dotnet workload install wasm-tools wasm-experimental
-
- task: CmdLine@2
displayName: 'Run Build'
inputs:
@@ -71,34 +55,11 @@ jobs:
pool:
vmImage: 'macos-12'
steps:
- - task: UseDotNet@2
- displayName: 'Use .NET Core SDK 3.1.418'
- inputs:
- version: 3.1.418
-
- task: UseDotNet@2
displayName: 'Use .NET Core SDK 6.0.401'
inputs:
version: 6.0.401
-
- - task: UseDotNet@2
- displayName: 'Use .NET Core SDK 7.0.100-rc.1.22431.12'
- inputs:
- version: 7.0.100-rc.1.22431.12
-
- - task: CmdLine@2
- displayName: 'Install Workloads'
- inputs:
- script: |
- dotnet workload install android ios wasm-tools wasm-experimental
- - task: CmdLine@2
- displayName: 'Install Mono 5.18'
- inputs:
- script: |
- curl -o ./mono.pkg https://download.mono-project.com/archive/5.18.0/macos-10-universal/MonoFramework-MDK-5.18.0.225.macos10.xamarin.universal.pkg
- sudo installer -verbose -pkg ./mono.pkg -target /
-
- task: CmdLine@2
displayName: 'Generate avalonia-native'
inputs:
@@ -154,21 +115,11 @@ jobs:
variables:
SolutionDir: '$(Build.SourcesDirectory)'
steps:
- - task: UseDotNet@2
- displayName: 'Use .NET Core SDK 3.1.418'
- inputs:
- version: 3.1.418
-
- task: UseDotNet@2
displayName: 'Use .NET Core SDK 6.0.401'
inputs:
version: 6.0.401
- - task: UseDotNet@2
- displayName: 'Use .NET Core SDK 7.0.100-rc.1.22431.12'
- inputs:
- version: 7.0.100-rc.1.22431.12
-
- task: CmdLine@2
displayName: 'Install Workloads'
inputs:
@@ -179,7 +130,7 @@ jobs:
displayName: 'Install Nuke'
inputs:
script: |
- dotnet tool install --global Nuke.GlobalTool --version 0.24.0
+ dotnet tool install --global Nuke.GlobalTool --version 6.2.1
- task: CmdLine@2
displayName: 'Run Nuke'
diff --git a/build.cmd b/build.cmd
new file mode 100644
index 0000000000..b08cc590f4
--- /dev/null
+++ b/build.cmd
@@ -0,0 +1,7 @@
+:; set -eo pipefail
+:; SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)
+:; ${SCRIPT_DIR}/build.sh "$@"
+:; exit $?
+
+@ECHO OFF
+powershell -ExecutionPolicy ByPass -NoProfile -File "%~dp0build.ps1" %*
diff --git a/build.ps1 b/build.ps1
index 985e8abcee..997e5b423f 100644
--- a/build.ps1
+++ b/build.ps1
@@ -1,13 +1,12 @@
[CmdletBinding()]
Param(
- #[switch]$CustomParam,
[Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]
[string[]]$BuildArguments
)
-Write-Output "Windows PowerShell $($Host.Version)"
+Write-Output "PowerShell $($PSVersionTable.PSEdition) version $($PSVersionTable.PSVersion)"
-Set-StrictMode -Version 2.0; $ErrorActionPreference = "Stop"; $ConfirmPreference = "None"; trap { exit 1 }
+Set-StrictMode -Version 2.0; $ErrorActionPreference = "Stop"; $ConfirmPreference = "None"; trap { Write-Error $_ -ErrorAction Continue; exit 1 }
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
###########################################################################
@@ -15,15 +14,15 @@ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
###########################################################################
$BuildProjectFile = "$PSScriptRoot\nukebuild\_build.csproj"
-$TempDirectory = "$PSScriptRoot\\.tmp"
+$TempDirectory = "$PSScriptRoot\\.nuke\temp"
$DotNetGlobalFile = "$PSScriptRoot\\global.json"
-$DotNetInstallUrl = "https://raw.githubusercontent.com/dotnet/cli/master/scripts/obtain/dotnet-install.ps1"
+$DotNetInstallUrl = "https://dot.net/v1/dotnet-install.ps1"
$DotNetChannel = "Current"
$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE = 1
$env:DOTNET_CLI_TELEMETRY_OPTOUT = 1
-$env:NUGET_XMLDOC_MODE = "skip"
+$env:DOTNET_MULTILEVEL_LOOKUP = 0
###########################################################################
# EXECUTION
@@ -34,38 +33,37 @@ function ExecSafe([scriptblock] $cmd) {
if ($LASTEXITCODE) { exit $LASTEXITCODE }
}
-# If global.json exists, load expected version
-if (Test-Path $DotNetGlobalFile) {
- $DotNetGlobal = $(Get-Content $DotNetGlobalFile | Out-String | ConvertFrom-Json)
- if ($DotNetGlobal.PSObject.Properties["sdk"] -and $DotNetGlobal.sdk.PSObject.Properties["version"]) {
- $DotNetVersion = $DotNetGlobal.sdk.version
- }
-}
-
-# If dotnet is installed locally, and expected version is not set or installation matches the expected version
+# If dotnet CLI is installed globally and it matches requested version, use for execution
if ($null -ne (Get-Command "dotnet" -ErrorAction SilentlyContinue) -and `
- (!(Test-Path variable:DotNetVersion) -or $(& dotnet --version) -eq $DotNetVersion)) {
+ $(dotnet --version) -and $LASTEXITCODE -eq 0) {
$env:DOTNET_EXE = (Get-Command "dotnet").Path
}
else {
- $DotNetDirectory = "$TempDirectory\dotnet-win"
- $env:DOTNET_EXE = "$DotNetDirectory\dotnet.exe"
-
# Download install script
$DotNetInstallFile = "$TempDirectory\dotnet-install.ps1"
- mkdir -force $TempDirectory > $null
+ New-Item -ItemType Directory -Path $TempDirectory -Force | Out-Null
+ [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
(New-Object System.Net.WebClient).DownloadFile($DotNetInstallUrl, $DotNetInstallFile)
+ # If global.json exists, load expected version
+ if (Test-Path $DotNetGlobalFile) {
+ $DotNetGlobal = $(Get-Content $DotNetGlobalFile | Out-String | ConvertFrom-Json)
+ if ($DotNetGlobal.PSObject.Properties["sdk"] -and $DotNetGlobal.sdk.PSObject.Properties["version"]) {
+ $DotNetVersion = $DotNetGlobal.sdk.version
+ }
+ }
+
# Install by channel or version
+ $DotNetDirectory = "$TempDirectory\dotnet-win"
if (!(Test-Path variable:DotNetVersion)) {
- ExecSafe { & $DotNetInstallFile -InstallDir $DotNetDirectory -Channel $DotNetChannel -NoPath }
+ ExecSafe { & powershell $DotNetInstallFile -InstallDir $DotNetDirectory -Channel $DotNetChannel -NoPath }
} else {
- ExecSafe { & $DotNetInstallFile -InstallDir $DotNetDirectory -Version $DotNetVersion -NoPath }
+ ExecSafe { & powershell $DotNetInstallFile -InstallDir $DotNetDirectory -Version $DotNetVersion -NoPath }
}
-
- $env:PATH="$DotNetDirectory;$env:PATH"
+ $env:DOTNET_EXE = "$DotNetDirectory\dotnet.exe"
}
-Write-Output "Microsoft (R) .NET Core SDK version $(& $env:DOTNET_EXE --version)"
+Write-Output "Microsoft (R) .NET SDK version $(& $env:DOTNET_EXE --version)"
-ExecSafe { & $env:DOTNET_EXE run --project $BuildProjectFile -- $BuildArguments }
+ExecSafe { & $env:DOTNET_EXE build $BuildProjectFile /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet }
+ExecSafe { & $env:DOTNET_EXE run --project $BuildProjectFile --no-build -- $BuildArguments }
diff --git a/build.sh b/build.sh
index 9532b4fbe0..76919a5351 100755
--- a/build.sh
+++ b/build.sh
@@ -1,16 +1,6 @@
#!/usr/bin/env bash
-echo $(bash --version 2>&1 | head -n 1)
-
-#CUSTOMPARAM=0
-BUILD_ARGUMENTS=()
-for i in "$@"; do
- case $(echo $1 | awk '{print tolower($0)}') in
- # -custom-param) CUSTOMPARAM=1;;
- *) BUILD_ARGUMENTS+=("$1") ;;
- esac
- shift
-done
+bash --version 2>&1 | head -n 1
set -eo pipefail
SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)
@@ -20,11 +10,53 @@ SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)
###########################################################################
BUILD_PROJECT_FILE="$SCRIPT_DIR/nukebuild/_build.csproj"
+TEMP_DIRECTORY="$SCRIPT_DIR//.nuke/temp"
+
+DOTNET_GLOBAL_FILE="$SCRIPT_DIR//global.json"
+DOTNET_INSTALL_URL="https://dot.net/v1/dotnet-install.sh"
+DOTNET_CHANNEL="Current"
export DOTNET_CLI_TELEMETRY_OPTOUT=1
export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
-export NUGET_XMLDOC_MODE="skip"
+export DOTNET_MULTILEVEL_LOOKUP=0
-dotnet --info
+###########################################################################
+# EXECUTION
+###########################################################################
-dotnet run --project "$BUILD_PROJECT_FILE" -- ${BUILD_ARGUMENTS[@]}
+function FirstJsonValue {
+ perl -nle 'print $1 if m{"'"$1"'": "([^"]+)",?}' <<< "${@:2}"
+}
+
+# If dotnet CLI is installed globally and it matches requested version, use for execution
+if [ -x "$(command -v dotnet)" ] && dotnet --version &>/dev/null; then
+ export DOTNET_EXE="$(command -v dotnet)"
+else
+ # Download install script
+ DOTNET_INSTALL_FILE="$TEMP_DIRECTORY/dotnet-install.sh"
+ mkdir -p "$TEMP_DIRECTORY"
+ curl -Lsfo "$DOTNET_INSTALL_FILE" "$DOTNET_INSTALL_URL"
+ chmod +x "$DOTNET_INSTALL_FILE"
+
+ # If global.json exists, load expected version
+ if [[ -f "$DOTNET_GLOBAL_FILE" ]]; then
+ DOTNET_VERSION=$(FirstJsonValue "version" "$(cat "$DOTNET_GLOBAL_FILE")")
+ if [[ "$DOTNET_VERSION" == "" ]]; then
+ unset DOTNET_VERSION
+ fi
+ fi
+
+ # Install by channel or version
+ DOTNET_DIRECTORY="$TEMP_DIRECTORY/dotnet-unix"
+ if [[ -z ${DOTNET_VERSION+x} ]]; then
+ "$DOTNET_INSTALL_FILE" --install-dir "$DOTNET_DIRECTORY" --channel "$DOTNET_CHANNEL" --no-path
+ else
+ "$DOTNET_INSTALL_FILE" --install-dir "$DOTNET_DIRECTORY" --version "$DOTNET_VERSION" --no-path
+ fi
+ export DOTNET_EXE="$DOTNET_DIRECTORY/dotnet"
+fi
+
+echo "Microsoft (R) .NET SDK version $("$DOTNET_EXE" --version)"
+
+"$DOTNET_EXE" build "$BUILD_PROJECT_FILE" /nodeReuse:false /p:UseSharedCompilation=false -nologo -clp:NoSummary --verbosity quiet
+"$DOTNET_EXE" run --project "$BUILD_PROJECT_FILE" --no-build -- "$@"
diff --git a/dirs.proj b/dirs.proj
index 47ad0dfd55..a2544ef951 100644
--- a/dirs.proj
+++ b/dirs.proj
@@ -23,12 +23,13 @@
+
-
+
diff --git a/global.json b/global.json
index 44d4e10dbf..7c2daee25f 100644
--- a/global.json
+++ b/global.json
@@ -1,4 +1,8 @@
{
+ "sdk": {
+ "version": "6.0.401",
+ "rollForward": "latestFeature"
+ },
"msbuild-sdks": {
"Microsoft.Build.Traversal": "1.0.43",
"MSBuild.Sdk.Extras": "3.0.22",
diff --git a/nukebuild/Build.cs b/nukebuild/Build.cs
index 4bbb667154..358549db55 100644
--- a/nukebuild/Build.cs
+++ b/nukebuild/Build.cs
@@ -163,7 +163,7 @@ partial class Build : NukeBuild
.EnableNoBuild()
.EnableNoRestore()
.When(Parameters.PublishTestResults, _ => _
- .SetLogger("trx")
+ .SetLoggers("trx")
.SetResultsDirectory(Parameters.TestResultsRoot)));
}
}
@@ -215,8 +215,6 @@ partial class Build : NukeBuild
RunCoreTest("Avalonia.DesignerSupport.Tests");
});
- [PackageExecutable("JetBrains.dotMemoryUnit", "dotMemoryUnit.exe")] readonly Tool DotMemoryUnit;
-
Target RunLeakTests => _ => _
.OnlyWhenStatic(() => !Parameters.SkipTests && Parameters.IsRunningOnWindows)
.DependsOn(Compile)
@@ -224,12 +222,9 @@ partial class Build : NukeBuild
{
void DoMemoryTest()
{
- var testAssembly = "tests\\Avalonia.LeakTests\\bin\\Release\\net461\\Avalonia.LeakTests.dll";
- DotMemoryUnit(
- $"{XunitPath.DoubleQuoteIfNeeded()} --propagate-exit-code -- {testAssembly}",
- timeout: 120_000);
+ RunCoreTest("Avalonia.LeakTests");
}
- ControlFlow.ExecuteWithRetry(DoMemoryTest, waitInSeconds: 3);
+ ControlFlow.ExecuteWithRetry(DoMemoryTest, delay: TimeSpan.FromMilliseconds(3));
});
Target ZipFiles => _ => _
diff --git a/nukebuild/BuildParameters.cs b/nukebuild/BuildParameters.cs
index 1826623674..dfa914d1db 100644
--- a/nukebuild/BuildParameters.cs
+++ b/nukebuild/BuildParameters.cs
@@ -74,11 +74,11 @@ public partial class Build
MSBuildSolution = RootDirectory / "dirs.proj";
// PARAMETERS
- IsLocalBuild = Host == HostType.Console;
+ IsLocalBuild = NukeBuild.IsLocalBuild;
IsRunningOnUnix = Environment.OSVersion.Platform == PlatformID.Unix ||
Environment.OSVersion.Platform == PlatformID.MacOSX;
IsRunningOnWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
- IsRunningOnAzure = Host == HostType.AzurePipelines ||
+ IsRunningOnAzure = Host is AzurePipelines ||
Environment.GetEnvironmentVariable("LOGNAME") == "vsts";
if (IsRunningOnAzure)
diff --git a/nukebuild/DotNetConfigHelper.cs b/nukebuild/DotNetConfigHelper.cs
index 932525288c..eca1e2684d 100644
--- a/nukebuild/DotNetConfigHelper.cs
+++ b/nukebuild/DotNetConfigHelper.cs
@@ -46,7 +46,7 @@ public class DotNetConfigHelper
public DotNetConfigHelper SetVerbosity(DotNetVerbosity verbosity)
{
Build = Build?.SetVerbosity(verbosity);
- Pack = Pack?.SetVerbostiy(verbosity);
+ Pack = Pack?.SetVerbosity(verbosity);
Test = Test?.SetVerbosity(verbosity);
return this;
}
@@ -54,4 +54,4 @@ public class DotNetConfigHelper
public static implicit operator DotNetConfigHelper(DotNetBuildSettings s) => new DotNetConfigHelper(s);
public static implicit operator DotNetConfigHelper(DotNetPackSettings s) => new DotNetConfigHelper(s);
public static implicit operator DotNetConfigHelper(DotNetTestSettings s) => new DotNetConfigHelper(s);
-}
\ No newline at end of file
+}
diff --git a/nukebuild/Shims.cs b/nukebuild/Shims.cs
index 1ac14bf622..6f79972ad6 100644
--- a/nukebuild/Shims.cs
+++ b/nukebuild/Shims.cs
@@ -49,7 +49,11 @@ public partial class Build
{
if (fsEntry is FileInfo)
{
+#if NET6
var relPath = Path.GetRelativePath(rootPath, fsEntry.FullName);
+#else
+ var relPath = GetRelativePath(rootPath, fsEntry.FullName);
+#endif
AddFile(fsEntry.FullName, relPath);
}
}
@@ -78,6 +82,17 @@ public partial class Build
}
}
+ private static string GetRelativePath(string relativeTo, string path)
+ {
+ var uri = new Uri(relativeTo);
+ var rel = Uri.UnescapeDataString(uri.MakeRelativeUri(new Uri(path)).ToString()).Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
+ if (rel.Contains(Path.DirectorySeparatorChar.ToString()) == false)
+ {
+ rel = $".{Path.DirectorySeparatorChar}{rel}";
+ }
+ return rel;
+ }
+
class NumergeNukeLogger : INumergeLogger
{
public void Log(NumergeLogLevel level, string message)
diff --git a/nukebuild/_build.csproj b/nukebuild/_build.csproj
index aa5724c75e..5db9579876 100644
--- a/nukebuild/_build.csproj
+++ b/nukebuild/_build.csproj
@@ -1,40 +1,44 @@
Exe
- netcoreapp3.1
false
False
CS0649;CS0169
+ 1
+ net6.0
+
-
-
+
-
-
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/nukebuild/il-repack b/nukebuild/il-repack
new file mode 160000
index 0000000000..892f079ea8
--- /dev/null
+++ b/nukebuild/il-repack
@@ -0,0 +1 @@
+Subproject commit 892f079ea8cb0c178f0a68f53a7a7eac13acdda9
diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml
index 7f5a191519..ec198c6bba 100644
--- a/samples/ControlCatalog/MainView.xaml
+++ b/samples/ControlCatalog/MainView.xaml
@@ -19,6 +19,9 @@
+
+
+
diff --git a/samples/ControlCatalog/MainView.xaml.cs b/samples/ControlCatalog/MainView.xaml.cs
index 7133ddaa6a..7001eb41ea 100644
--- a/samples/ControlCatalog/MainView.xaml.cs
+++ b/samples/ControlCatalog/MainView.xaml.cs
@@ -2,10 +2,10 @@ using System;
using System.Collections;
using Avalonia;
using Avalonia.Controls;
+using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
using Avalonia.Media.Immutable;
-using Avalonia.Platform;
using Avalonia.Themes.Fluent;
using ControlCatalog.Models;
using ControlCatalog.Pages;
@@ -20,7 +20,7 @@ namespace ControlCatalog
var sideBar = this.Get("Sidebar");
- if (AvaloniaLocator.Current?.GetService()?.GetRuntimeInfo().IsDesktop == true)
+ if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime)
{
var tabItems = (sideBar.Items as IList);
tabItems?.Add(new TabItem()
@@ -28,7 +28,6 @@ namespace ControlCatalog
Header = "Screens",
Content = new ScreenPage()
});
-
}
var themes = this.Get("Themes");
diff --git a/samples/ControlCatalog/Pages/AdornerLayerPage.xaml b/samples/ControlCatalog/Pages/AdornerLayerPage.xaml
new file mode 100644
index 0000000000..598844d695
--- /dev/null
+++ b/samples/ControlCatalog/Pages/AdornerLayerPage.xaml
@@ -0,0 +1,66 @@
+
+
+
+
+ Rotation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlCatalog/Pages/AdornerLayerPage.xaml.cs b/samples/ControlCatalog/Pages/AdornerLayerPage.xaml.cs
new file mode 100644
index 0000000000..0cf4a6633c
--- /dev/null
+++ b/samples/ControlCatalog/Pages/AdornerLayerPage.xaml.cs
@@ -0,0 +1,48 @@
+using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
+using Avalonia.Interactivity;
+using Avalonia.Markup.Xaml;
+
+namespace ControlCatalog.Pages
+{
+ public class AdornerLayerPage : UserControl
+ {
+ private Control? _adorner;
+
+ public AdornerLayerPage()
+ {
+ this.InitializeComponent();
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+
+ private void RemoveAdorner_OnClick(object? sender, RoutedEventArgs e)
+ {
+ var adornerButton = this.FindControl