{"record":{"id":"3551fcb6a8740926","repo":"stride3d/stride","slug":"unsupported-solution-file-format-solutionfullpath","errorCode":null,"errorMessage":"Unsupported solution file format: '{solutionFullPath}'.","messagePattern":"Unsupported solution file format: '(.+?)'\\.","errorType":"exception","errorClass":"SolutionFileException","httpStatus":null,"severity":"error","filePath":"sources/core/Stride.Core.Design/Solutions/SolutionSerialization.cs","lineNumber":31,"sourceCode":"/// mapping between its model and the <see cref=\"Solution\"/> model used by the asset pipeline.\n/// </summary>\ninternal static class SolutionSerialization\n{\n    // A solution created from scratch gets a single Any CPU platform and Debug/Release build types;\n    // SolutionPersistence generates the per-project configuration mappings from these. A solution loaded\n    // from disk keeps whatever it already had (see Write).\n    private const string DefaultPlatform = \"Any CPU\";\n    private static readonly string[] DefaultBuildTypes = [\"Debug\", \"Release\"];\n\n    public static Solution Read(string solutionFullPath)\n    {\n        // A .slnf solution filter is JSON pointing at a real .sln; open the underlying solution so edits\n        // persist to it (the filter is a view, not a writable solution).\n        if (Path.GetExtension(solutionFullPath).Equals(\".slnf\", StringComparison.OrdinalIgnoreCase))\n            return Read(ResolveSolutionFilterTarget(solutionFullPath));\n\n        var serializer = SolutionSerializers.GetSerializerByMoniker(solutionFullPath)\n            ?? throw new SolutionFileException($\"Unsupported solution file format: '{solutionFullPath}'.\");\n        var model = serializer.OpenAsync(solutionFullPath, CancellationToken.None).GetAwaiter().GetResult();\n        var solution = ToSolution(model, solutionFullPath);\n        ReadDefaultStartup(solution, solutionFullPath);\n        return solution;\n    }\n\n    // The .sln a solution filter (.slnf) points at, resolved relative to the filter file.\n    private static string ResolveSolutionFilterTarget(string filterFile)\n    {\n        using var document = JsonDocument.Parse(File.ReadAllText(filterFile));\n        if (document.RootElement.TryGetProperty(\"solution\", out var solution)\n            && solution.TryGetProperty(\"path\", out var path)\n            && path.GetString() is { } relativePath)\n        {\n            return Path.GetFullPath(Path.Combine(Path.GetDirectoryName(filterFile)!, relativePath.Replace('\\\\', Path.DirectorySeparatorChar)));\n        }\n\n        throw new SolutionFileException($\"Solution filter '{filterFile}' does not reference a solution.\");","sourceCodeStart":13,"sourceCodeEnd":49,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/core/Stride.Core.Design/Solutions/SolutionSerialization.cs#L13-L49","documentation":"Thrown by SolutionSerialization.Read when no registered serializer moniker matches the given file's extension/format. The path does not look like a .sln, .slnf, or other supported solution format the library can open.","triggerScenarios":"Calling Read (or Solution.Open) with a path whose extension does not match any serializer registered in SolutionSerializers — e.g. passing a .csproj, .txt, or an unknown extension instead of a .sln/.slnf file.","commonSituations":"Passing the wrong file to the solution loader, using a custom solution format not registered, typos in the file extension.","solutions":["Pass a supported solution file (.sln or .slnf) path to Read","Verify the file extension is correct and the file exists at that path","If using a custom format, register a matching serializer moniker in SolutionSerializers"],"exampleFix":"// before\nvar solution = SolutionSerialization.Read(@\"C:\\repo\\MyApp\\MyApp.csproj\");\n// after\nvar solution = SolutionSerialization.Read(@\"C:\\repo\\MyApp\\MyApp.sln\");","handlingStrategy":"validation","validationCode":"var ext = Path.GetExtension(path);\nif (!ext.Equals(\".sln\", StringComparison.OrdinalIgnoreCase) &&\n    !ext.Equals(\".slnf\", StringComparison.OrdinalIgnoreCase))\n    throw new ArgumentException($\"Expected a .sln or .slnf file, got '{ext}'\");","typeGuard":"bool IsSupportedSolutionFile(string p) =>\n    Path.GetExtension(p) is \".sln\" or \".slnf\";","tryCatchPattern":"try { return SolutionSerialization.Read(path); }\ncatch (SolutionFileException ex) when (ex.Message.StartsWith(\"Unsupported solution file format\"))\n{\n    throw new ArgumentException($\"'{path}' is not a supported solution file\", nameof(path), ex);\n}","preventionTips":["Only pass .sln/.slnf files to solution loaders","Validate user-supplied paths before loading","Register custom serializers if you use non-standard solution formats"],"tags":["unsupported-format","solution","serialization"],"backgroundTag":"unsupported-operation","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}