Skip to content

Commit bee21f2

Browse files
committed
More robust OS version resolution
Close #11.
1 parent 5f11150 commit bee21f2

File tree

4 files changed

+64
-27
lines changed

4 files changed

+64
-27
lines changed

src/VirtualDesktop/Interop/ComInterfaceAssemblyBuilder.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ internal class ComInterfaceAssemblyBuilder
2525
// Now using assembly version even though regenerating our DLL won't strictly be needed for every new version this is the safest option
2626
// Otherwise people will surely forget to increment a specific version here
2727
private static readonly Version? _requireVersion = Assembly.GetExecutingAssembly().GetName().Version;
28-
private static readonly Regex _assemblyRegex = new(@"VirtualDesktop\.(?<build>\d{5}\.\d{4}?)(\.\w*|)\.dll");
29-
private static readonly Regex _buildNumberRegex = new(@"\.Build(?<build>\d{5}\.\d{4})\.");
30-
private static readonly double osBuild = OS.Build();
28+
private static readonly Regex _assemblyRegex = new(@"VirtualDesktop\.10\.0\.(?<build>\d+\.\d+)(\.\w*|)\.dll");
29+
private static readonly Regex _buildNumberRegex = new(@"\.Build(?<build>\d+\.\d+)\.");
30+
private static readonly Version osBuild = OS.Build;
31+
3132
private static ComInterfaceAssembly? _assembly;
3233

3334
private readonly VirtualDesktopCompilerConfiguration _configuration;
@@ -46,7 +47,7 @@ public ComInterfaceAssembly GetAssembly()
4647
{
4748
foreach (var file in this._configuration.CompiledAssemblySaveDirectory.GetFiles())
4849
{
49-
if (double.TryParse(_assemblyRegex.Match(file.Name).Groups["build"].ToString(), out var build)
50+
if (Version.TryParse(OS.VersionPrefix + _assemblyRegex.Match(file.Name).Groups["build"].ToString(), out var build)
5051
&& build == osBuild)
5152
{
5253
try
@@ -57,6 +58,8 @@ public ComInterfaceAssembly GetAssembly()
5758
Debug.WriteLine($"Assembly found: {file.FullName}");
5859
#if !DEBUG
5960
return Assembly.LoadFile(file.FullName);
61+
#else
62+
Debug.WriteLine($"Debug force assembly creation");
6063
#endif
6164
}
6265
else
@@ -110,19 +113,19 @@ private Assembly CreateAssembly()
110113
// └── 22000, VirtualDesktop.Interop.Build22000..interfaces.IVirtualDesktop.cs
111114
// IVirtualDesktopPinnedApps
112115
// └── 10240, VirtualDesktop.Interop.Build10240..interfaces.IVirtualDesktopPinnedApps.cs
113-
var interfaceSourceFiles = new Dictionary<string, SortedList<double, string>>();
116+
var interfaceSourceFiles = new Dictionary<string, SortedList<Version, string>>();
114117

115118
// This is where we decide which interface variant goes into our generated DLL assembly
116119
foreach (var name in executingAssembly.GetManifestResourceNames())
117120
{
118121
var interfaceName = Path.GetFileNameWithoutExtension(name).Split('.').LastOrDefault();
119122
if (interfaceName != null
120123
&& interfaceNames.Contains(interfaceName)
121-
&& double.TryParse(_buildNumberRegex.Match(name.Replace('_','.')).Groups["build"].ToString(), out var build))
124+
&& Version.TryParse(OS.VersionPrefix + _buildNumberRegex.Match(name.Replace('_','.')).Groups["build"].ToString(), out var build))
122125
{
123126
if (interfaceSourceFiles.TryGetValue(interfaceName, out var sourceFiles) == false)
124127
{
125-
sourceFiles = new SortedList<double, string>();
128+
sourceFiles = new SortedList<Version, string>();
126129
interfaceSourceFiles.Add(interfaceName, sourceFiles);
127130
}
128131

src/VirtualDesktop/Interop/IID.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
namespace WindowsDesktop.Interop;
1313

1414
internal record OsBuildSettings(
15-
double osBuild,
15+
Version osBuild,
1616
SettingsProperty prop);
1717

1818
internal static class IID
1919
{
20-
private static readonly Regex _osBuildRegex = new(@"v_(?<build>\d{5}_\d{4}?)");
21-
20+
private static readonly Regex _osBuildRegex = new(@"v_(?<build>\d+_\d+)");
21+
2222
// ReSharper disable once InconsistentNaming
2323
public static Dictionary<string, Guid> GetIIDs(string[] interfaceNames)
2424
{
@@ -28,7 +28,7 @@ public static Dictionary<string, Guid> GetIIDs(string[] interfaceNames)
2828
var orderedProps = Settings.Default.Properties.OfType<SettingsProperty>()
2929
.Select(prop =>
3030
{
31-
if (double.TryParse(_osBuildRegex.Match(prop.Name).Groups["build"].ToString().Replace('_','.'), NumberStyles.Any, CultureInfo.InvariantCulture, out var build))
31+
if (Version.TryParse(OS.VersionPrefix + _osBuildRegex.Match(prop.Name).Groups["build"].ToString().Replace('_','.'), out var build))
3232
{
3333
return new OsBuildSettings(build, prop);
3434
}
@@ -41,15 +41,15 @@ public static Dictionary<string, Guid> GetIIDs(string[] interfaceNames)
4141

4242
// Find first prop with build version <= current OS version
4343
var selectedSettings = orderedProps.FirstOrDefault(p =>
44-
p.osBuild <= OS.Build()
44+
p.osBuild <= OS.Build
4545
);
4646

4747
if (selectedSettings == null)
4848
{
4949
var supportedBuilds = orderedProps.Select(v => v.osBuild).ToArray();
5050
throw new ConfigurationException(
5151
"Invalid application configuration. Unable to determine interop interfaces for " +
52-
$"current OS Build: {OS.Build()}. All configured OS Builds " +
52+
$"current OS Build: {OS.Build}. All configured OS Builds " +
5353
$"have build version greater than current OS: {supportedBuilds}");
5454
}
5555

src/VirtualDesktop/Utils/OS.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,19 @@ internal class OS
1313
/// Return the OS Build number such as: 22621.2215
1414
/// </summary>
1515
/// <returns></returns>
16-
public static double Build()
16+
public static Version Build
1717
{
18-
int _osBuild = Environment.OSVersion.Version.Build;
19-
int _osRevision = int.Parse(Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue("UBR").ToString());
20-
double _osId = _osBuild + (_osRevision / 10000d);
21-
return _osId;
18+
get
19+
{
20+
Version v = Environment.OSVersion.Version;
21+
Version actual = new(v.Major, v.Minor, v.Build, int.Parse(Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue("UBR").ToString()));
22+
return actual;
23+
}
2224
}
25+
26+
/// <summary>
27+
///
28+
/// </summary>
29+
public static readonly String VersionPrefix = "10.0.";
2330
}
2431
}

src/VirtualDesktop/VirtualDesktop.system.cs

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,48 @@ public static bool IsSupported
3535

3636
static VirtualDesktop()
3737
{
38-
_provider = OS.Build() switch
39-
{
40-
>= 22621.2215 => new VirtualDesktopProvider22621(), // Windows 11 22H2
41-
>= 22000 => new VirtualDesktopProvider22000(), //Windows 11 21H2
42-
>= 20348 => new VirtualDesktopProvider20348(), // Windows Server 2022
43-
>= 10240 => new VirtualDesktopProvider10240(),
44-
_ => new VirtualDesktopProvider.NotSupported()
45-
};
38+
39+
_provider = CreateProvider();
4640

4741
Debug.WriteLine($"*** {AssemblyInfo.Title} Library ***");
4842
Debug.WriteLine($"Version: {AssemblyInfo.VersionString}");
49-
Debug.WriteLine($"OS Build: {OS.Build()}");
43+
Debug.WriteLine($"OS Build: {OS.Build}");
5044
Debug.WriteLine($"Provider: {_provider.GetType().Name}");
5145
}
5246

47+
/// <summary>
48+
/// Create provider for current OS version.
49+
/// Test order matters. Make sure you test the highest version first.
50+
/// </summary>
51+
/// <returns></returns>
52+
private static VirtualDesktopProvider CreateProvider()
53+
{
54+
Version v = OS.Build;
55+
56+
if (v >= new Version(10, 0, 22621, 2215))
57+
{
58+
return new VirtualDesktopProvider22621();
59+
}
60+
61+
if (v >= new Version(10, 0, 22000, 0))
62+
{
63+
return new VirtualDesktopProvider22000();
64+
}
65+
66+
if (v >= new Version(10, 0, 20348, 0))
67+
{
68+
return new VirtualDesktopProvider20348();
69+
}
70+
71+
if (v >= new Version(10, 0, 10240, 0))
72+
{
73+
return new VirtualDesktopProvider10240();
74+
}
75+
76+
return new VirtualDesktopProvider.NotSupported();
77+
}
78+
79+
5380
private VirtualDesktop(IVirtualDesktop source)
5481
{
5582
this._source = source;

0 commit comments

Comments
 (0)