diff --git a/src/Avalonia.Controls/Platform/ExportWindowingSubsystemAttribute.cs b/src/Avalonia.Controls/Platform/ExportWindowingSubsystemAttribute.cs index 628f73ca80..420c56111f 100644 --- a/src/Avalonia.Controls/Platform/ExportWindowingSubsystemAttribute.cs +++ b/src/Avalonia.Controls/Platform/ExportWindowingSubsystemAttribute.cs @@ -9,16 +9,19 @@ namespace Avalonia.Platform [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] public class ExportWindowingSubsystemAttribute : Attribute { - public ExportWindowingSubsystemAttribute(OperatingSystemType requiredRuntimePlatform, int priority, string name, Type initializationType, string initializationMethod) + public ExportWindowingSubsystemAttribute(OperatingSystemType requiredRuntimePlatform, int priority, string name, Type initializationType, + string initializationMethod, Type environmentChecker = null) { Name = name; InitializationType = initializationType; InitializationMethod = initializationMethod; + EnvironmentChecker = environmentChecker; RequiredOS = requiredRuntimePlatform; Priority = priority; } public string InitializationMethod { get; private set; } + public Type EnvironmentChecker { get; } public Type InitializationType { get; private set; } public string Name { get; private set; } public int Priority { get; private set; } diff --git a/src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs b/src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs index f643bfe6e2..fc7fdd2431 100644 --- a/src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs +++ b/src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs @@ -31,6 +31,20 @@ namespace Avalonia Instance = app; } + bool CheckEnvironment(Type checkerType) + { + if (checkerType == null) + return true; + try + { + return ((IModuleEnvironmentChecker) Activator.CreateInstance(checkerType)).IsCompatible; + } + catch + { + return false; + } + } + /// /// Instructs the to use the best settings for the platform. /// @@ -43,13 +57,13 @@ namespace Avalonia var windowingSubsystemAttribute = (from assembly in RuntimePlatform.GetLoadedAssemblies() from attribute in assembly.GetCustomAttributes() - where attribute.RequiredOS == os + where attribute.RequiredOS == os && CheckEnvironment(attribute.EnvironmentChecker) orderby attribute.Priority ascending select attribute).First(); var renderingSubsystemAttribute = (from assembly in RuntimePlatform.GetLoadedAssemblies() from attribute in assembly.GetCustomAttributes() - where attribute.RequiredOS == os + where attribute.RequiredOS == os && CheckEnvironment(attribute.EnvironmentChecker) where attribute.RequiresWindowingSubsystem == null || attribute.RequiresWindowingSubsystem == windowingSubsystemAttribute.Name orderby attribute.Priority ascending diff --git a/src/Avalonia.Visuals/Avalonia.Visuals.csproj b/src/Avalonia.Visuals/Avalonia.Visuals.csproj index dd43f1d8f0..a0ed19d2b4 100644 --- a/src/Avalonia.Visuals/Avalonia.Visuals.csproj +++ b/src/Avalonia.Visuals/Avalonia.Visuals.csproj @@ -102,6 +102,7 @@ + diff --git a/src/Avalonia.Visuals/Platform/ExportRenderingSubsystemAttribute.cs b/src/Avalonia.Visuals/Platform/ExportRenderingSubsystemAttribute.cs index a020bf9b1c..73526d7622 100644 --- a/src/Avalonia.Visuals/Platform/ExportRenderingSubsystemAttribute.cs +++ b/src/Avalonia.Visuals/Platform/ExportRenderingSubsystemAttribute.cs @@ -9,16 +9,19 @@ namespace Avalonia.Platform [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] public class ExportRenderingSubsystemAttribute : Attribute { - public ExportRenderingSubsystemAttribute(OperatingSystemType requiredOS, int priority, string name, Type initializationType, string initializationMethod) + public ExportRenderingSubsystemAttribute(OperatingSystemType requiredOS, int priority, string name, Type initializationType, string initializationMethod, + Type environmentChecker = null) { Name = name; InitializationType = initializationType; InitializationMethod = initializationMethod; + EnvironmentChecker = environmentChecker; RequiredOS = requiredOS; Priority = priority; } public string InitializationMethod { get; private set; } + public Type EnvironmentChecker { get; } public Type InitializationType { get; private set; } public string Name { get; private set; } public int Priority { get; private set; } diff --git a/src/Avalonia.Visuals/Platform/IModuleEnvironmentChecker.cs b/src/Avalonia.Visuals/Platform/IModuleEnvironmentChecker.cs new file mode 100644 index 0000000000..d8d3a19af6 --- /dev/null +++ b/src/Avalonia.Visuals/Platform/IModuleEnvironmentChecker.cs @@ -0,0 +1,7 @@ +namespace Avalonia.Platform +{ + public interface IModuleEnvironmentChecker + { + bool IsCompatible { get; } + } +} \ No newline at end of file diff --git a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj index a84a56d0d7..a055a337eb 100644 --- a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj +++ b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj @@ -83,6 +83,7 @@ + diff --git a/src/Windows/Avalonia.Direct2D1/Properties/AssemblyInfo.cs b/src/Windows/Avalonia.Direct2D1/Properties/AssemblyInfo.cs index 3ab086b156..63d9c5bfe3 100644 --- a/src/Windows/Avalonia.Direct2D1/Properties/AssemblyInfo.cs +++ b/src/Windows/Avalonia.Direct2D1/Properties/AssemblyInfo.cs @@ -6,5 +6,6 @@ using Avalonia.Platform; using Avalonia.Direct2D1; [assembly: AssemblyTitle("Avalonia.Direct2D1")] -[assembly: ExportRenderingSubsystem(OperatingSystemType.WinNT, 1, "Direct2D1", typeof(Direct2D1Platform), nameof(Direct2D1Platform.Initialize))] +[assembly: ExportRenderingSubsystem(OperatingSystemType.WinNT, 1, "Direct2D1", typeof(Direct2D1Platform), nameof(Direct2D1Platform.Initialize), + typeof(WindowsVersionChecker))] diff --git a/src/Windows/Avalonia.Direct2D1/WindowsVersionChecker.cs b/src/Windows/Avalonia.Direct2D1/WindowsVersionChecker.cs new file mode 100644 index 0000000000..875167b71a --- /dev/null +++ b/src/Windows/Avalonia.Direct2D1/WindowsVersionChecker.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Avalonia.Platform; + +namespace Avalonia.Direct2D1 +{ + class WindowsVersionChecker : IModuleEnvironmentChecker + { + //Direct2D backend doesn't work with Win7 anymore + public bool IsCompatible => Environment.OSVersion.Version >= new Version(6, 2); + } +}