mirror of
https://github.com/icsharpcode/ILSpy.git
synced 2026-10-12 02:15:58 +00:00
Sanitizing a resource name is not injective: "a+b/logo.png", "a&b/logo.png" and "a#b/logo.png" all come out as "a-b/logo.png". The writers create files with FileMode.Create, so every colliding entry but the last was lost, and nothing was written to the error list to say so - an assembly can be built to make that happen to as many entries as it likes. A WPF probe assembly with 20 resource entries exported as 13 files. Uniquifying is enough because the exported item already pins the true name in its LogicalName, so the file on disk has to be unique, not faithful. The suffix search resumes where the previous collision on a name left off, so a crafted pile of collisions stays linear rather than quadratic, and the name is trimmed to keep the segment within the file system's limit. Directory creation moves inside the per-entry error recovery for the same reason: an entry named after a directory another entry needs makes it throw, and that has to cost the one entry rather than the rest of the container. Assisted-by: Claude:claude-opus-5[1m]:Claude Code