Restore a single deployment root and .NET assembly resolution [4/4] - #406
Open
andrewiethoff wants to merge 23 commits into
Open
Restore a single deployment root and .NET assembly resolution [4/4]#406andrewiethoff wants to merge 23 commits into
andrewiethoff wants to merge 23 commits into
Conversation
The provider was gated behind "no other release was found, or the search mode is Extensive", mirroring how the now dormant FreeDB lookup had been wired as a last resort. Since CTDB answers for virtually every recognised disc, that meant AccurateRip Meta was never consulted on the initial lookup: its release, its track metadata and its cover art only appeared after pressing Reload. Treat it as a peer of the CTDB metadata sources instead - whenever CTDB is asked for metadata, ask AccurateRip Meta too. A configured search mode of None still suppresses both. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RSHyfpM8tS5fv5bX2fn5Lk
Three defects that surfaced with the .NET 10 migration, all of them cases where .NET Framework used to provide something implicitly. Build output layout. Projects wrote to bin\<cfg>\$(TargetFramework)\..., and the SDK appends the target framework even to an explicitly declared OutputPath. That was harmless while every runnable project produced a net47 output, because bin\<cfg>\net47\ was then the one real deployment root and the other framework trees were unused byproducts. With executables on net10.0-windows, console tools on net10.0 and libraries on netstandard2.1 the root split into three, so the plugin folder no longer sat next to the running assembly and the GUI found only a fraction of its plugins. Pin the root through CueToolsBinRoot in Directory.Build.props, have every project opt into a subfolder of it and set AppendTargetFrameworkToOutputPath=false. Both collect_files scripts stop merging several roots, and the WindowsMediaLib submodule patch is regenerated to match. Plugin loading. CUEProcessorPlugins used Assembly.Load(AssemblyName), which worked only because .NET Framework filled in AssemblyName.CodeBase and honoured it as a load hint. On .NET, CodeBase is not consulted and Load() resolves by name against the host's deps.json, so every plugin the host does not itself reference failed with FileNotFoundException. Use Assembly.LoadFrom, which loads the file directly and also probes its directory for the plugin's own dependencies. Executable startup. Upstream combined <probing privatePath="plugins"/> in app.config with <Private>False</Private> on project references; .NET ignores app.config binding entirely, and Private=False keeps references out of deps.json, so eight executables could not start at all. Drop the blanket ItemDefinitionGroup from them. CUETools.Codecs.FLACCL keeps Private per reference, because a copy of CUETools.Codecs inside plugins\ would be picked up by the plugin scan and register the built-in codecs twice, while OpenCLNet does have to be copied next to the plugin. Also fixes GetPluginLogo in the EAC plugin, which loaded its logo through Properties.Resources and so deserialized a Bitmap via BinaryFormatter - unsupported since .NET 9. It now reads the PNG manifest stream directly, and the project embeds that resource. Verified on Debug and Release: unified layout, all 14 plugins load, libFLAC, MACLib, libwavpack, FLACCL and the built-in encoder round trip bit-identically, all console tools start, 99 tests pass and collect_files produces a clean distribution. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RSHyfpM8tS5fv5bX2fn5Lk
This was referenced Jul 31, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Merge order: 4 of 4
Depends on
feat/accuraterip-meta-implementation(#405), and transitively ondotnet10-update(#403). Merge last.dotnet10-updatesecurity-auditfeat/accuraterip-meta-implementationfix/net10-build-output-and-assembly-resolutionWhat this does
Three defects that surfaced with the .NET 10 port, all of them cases where .NET Framework used to supply something implicitly.
Build output layout
Projects wrote to
bin\<cfg>\$(TargetFramework)\..., and the SDK appends the target framework even to an explicitly declaredOutputPath. That was harmless while every runnable project produced anet47output:bin\<cfg>\net47\was then the one real deployment root and the other framework trees were unused byproducts. With executables onnet10.0-windows, console tools onnet10.0and libraries onnetstandard2.1, the root split into three, so thepluginsfolder no longer sat next to the running assembly and the GUI discovered only a fraction of its plugins.Fixed by pinning the root through a new
CueToolsBinRootproperty inDirectory.Build.props; every project opts into a subfolder of it and setsAppendTargetFrameworkToOutputPath=false. Bothcollect_filesscripts stop merging several roots, and the WindowsMediaLib submodule patch is regenerated to match.Plugin loading
CUEProcessorPluginsusedAssembly.Load(AssemblyName), which worked only because .NET Framework populatedAssemblyName.CodeBaseand honoured it as a load hint. On .NET,CodeBaseis not consulted andLoad()resolves by name against the host'sdeps.json, so every plugin the host does not itself reference failed withFileNotFoundException. Replaced withAssembly.LoadFrom, which loads the file directly and also probes its directory for the plugin's own dependencies.Executable startup
Upstream combined
<probing privatePath="plugins"/>inapp.configwith a blanket<Private>False</Private>on project references. .NET ignoresapp.configassembly binding entirely, andPrivate=Falsekeeps references out ofdeps.json— so eight executables could not start at all. The blanketItemDefinitionGroupis removed from them.CUETools.Codecs.FLACCLinstead setsPrivateper reference: a copy ofCUETools.Codecsinsideplugins\would be picked up by the plugin scan and register the built-in codecs twice, whileOpenCLNetdoes have to be copied next to the plugin.Also fixes
GetPluginLogoin the EAC plugin, which loaded its logo throughProperties.Resourcesand so deserialized aBitmapviaBinaryFormatter— unsupported since .NET 9. It now reads the PNG manifest stream directly, and the project embeds that resource.Verification
Debug and Release both build with 0 errors and no copy races. All 14 plugins load; libFLAC, MACLib, libwavpack, FLACCL and the built-in encoder each round trip bit-identically; every console tool starts; 99 tests pass; and
collect_files.batproduces a distribution with no target-framework folders, no test assemblies and no pdbs.Scope
1 commit, 65 files, +236 / −197.
Note on reviewing this stack
All four PRs target
master, because a cross-fork pull request can only target a branch that exists in this repository. Until #403 and #405 merge, this diff also contains their commits.