namespace PRecAnnot.Plant3D2026; public sealed record Plant3D2026Availability(bool IsAvailable, string InstallDirectory, IReadOnlyList MissingAssemblies) { public static Plant3D2026Availability Detect(string installDirectory) { var expected = new[] { "AcMgd.dll", "AcDbMgd.dll", "AcCoreMgd.dll", "PnPDataLinks.dll", Path.Combine("PLNT3D", "PnPProjectManagerMgd.dll"), Path.Combine("PLNT3D", "PnP3dObjectsMgd.dll") }; var missing = expected.Where(x => !File.Exists(Path.Combine(installDirectory, x))).ToArray(); return new(missing.Length == 0, installDirectory, missing); } } public sealed class Plant3D2026BlockedException(Plant3D2026Availability availability) : InvalidOperationException($"Plant 3D 2026 assemblies are unavailable at '{availability.InstallDirectory}'. Missing: {string.Join(", ", availability.MissingAssemblies)}") { }