{"record":{"id":"46220a4fd2dee596","repo":"AvaloniaUI/Avalonia","slug":"this-resource-doesn-t-exist-on-that-compositor","errorCode":null,"errorMessage":"This resource doesn't exist on that compositor","messagePattern":"This resource doesn't exist on that compositor","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Avalonia.Base/Rendering/Composition/Drawing/CompositorResourceHelpers.cs","lineNumber":84,"sourceCode":"    }\n\n    public T? TryGetForCompositor(Compositor compositor)\n    {\n        if (_dictionary.TryGetValue(compositor, out var handle))\n            return handle.Value;\n        return default;\n    }\n    \n    public T GetForCompositor(Compositor compositor)\n    {\n        if (_dictionary.TryGetValue(compositor, out var handle))\n            return handle.Value;\n        ThrowDoesNotExist();\n        return default;\n    }\n\n    [MethodImpl(MethodImplOptions.NoInlining), DoesNotReturn]\n    static void ThrowDoesNotExist() => throw new InvalidOperationException(\"This resource doesn't exist on that compositor\");\n    \n    public bool Release(Compositor compositor)\n    {\n        if (!_dictionary.TryGetValue(compositor, out var handle))\n            ThrowDoesNotExist();\n        if (handle.Release(compositor))\n        {\n            _dictionary.Remove(compositor);\n            return true;\n        }\n\n        return false;\n    }\n\n    public void ProcessPropertyChangeNotification(AvaloniaPropertyChangedEventArgs change)\n    {\n        if (change.OldValue is ICompositionRenderResource oldResource)\n            TransitiveReleaseAll(oldResource);","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/AvaloniaUI/Avalonia/blob/11c542726898ae954a1ef668c65ec79ec92ab17d/src/Avalonia.Base/Rendering/Composition/Drawing/CompositorResourceHelpers.cs#L66-L102","documentation":"CompositorResourceHolder.GetForCompositor and Release look up the resource by Compositor in an InlineDictionary; if no entry exists for that compositor, ThrowDoesNotExist fires. A composition render resource is per-compositor: it must be created/add-ref'd on a given compositor before it can be fetched or released there.","triggerScenarios":"Calling GetForCompositor(otherCompositor) or Release(otherCompositor) for a compositor on which the resource was never created via CreateOrAddRef.","commonSituations":"Sharing one ICompositionRenderResource across windows/surfaces that use different Compositor instances; releasing on the wrong compositor during teardown; reusing a brush created for one compositor with drawing on another.","solutions":["Always create/add-ref the resource on a compositor (CreateOrAddRef) before calling GetForCompositor on it.","Use TryGetForCompositor (which returns null instead of throwing) when the compositor association is uncertain.","Ensure each compositor that consumes the resource also releases it symmetrically."],"exampleFix":"// before\nvar server = resource.GetForCompositor(otherCompositor); // never created here -> throws\n\n// after\nresource.CreateOrAddRef(otherCompositor, owner, out var server);\n// ... later: resource.Release(otherCompositor);","handlingStrategy":"validation","validationCode":"// Use the non-throwing lookup when the compositor association is uncertain.\nvar server = resource.TryGetForCompositor(compositor);\nif (server is null) resource.CreateOrAddRef(compositor, owner, out server);","typeGuard":"bool ExistsOn(CompositorResourceHolder<T> h, Compositor c) => h.IsAttached && /* per-compositor */ true;","tryCatchPattern":"try { return resource.GetForCompositor(c); }\ncatch (InvalidOperationException ex) when (ex.Message == \"This resource doesn't exist on that compositor\")\n{ resource.CreateOrAddRef(c, owner, out var s); return s; }","preventionTips":["Prefer TryGetForCompositor over GetForCompositor when unsure.","Always CreateOrAddRef on a compositor before GetForCompositor there.","Release symmetrically on each compositor that consumed the resource."],"tags":["composition","resource","compositor","cross-compositor"],"backgroundTag":null,"analyzedSha":"11c542726898ae954a1ef668c65ec79ec92ab17d","analyzedAt":"2026-08-13T11:57:40.261Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}