mirror of https://github.com/icsharpcode/ILSpy.git
Branch:
fix/2093-navigateto-reference-assembly
christophwille/closedhierarchies
christophwille/membench
compound-assignment-operators
fix/1982-params-attribute-args
fix/2040-invalid-xml-characters
fix/2093-navigateto-reference-assembly
fix/2362-xalz-references
fix/2372-address-taken-by
fix/3282-indexer-optional-arguments
fix/3568-record-member-order
fix/4059-deconstruct-out-slots
fix/lambda-parameter-syntax
fix/scroll-children-on-expand
gh-pages
ldmembertoken
master
natural-type-lambdas-methods
null-coalescing-assignment
release/10.1
release/6.2
release/7.1
release/7.2
release/8.1
substring-optimizations
tests/829-async-method-builder-override
tests/829-collection-expressions
tests/829-compound-assignment-operators
tests/829-coverage-audit
tests/829-expression-tree-named-optional-args
tests/829-expression-variables-in-initializers
tests/829-extended-property-patterns
tests/829-extension-members
tests/829-extension-operators
tests/829-file-local-types
tests/829-improved-definite-assignment
tests/829-improved-overload-candidates
tests/829-inline-arrays
tests/829-interpolated-string-improvements
tests/829-lambda-param-modifiers
tests/829-list-patterns
tests/829-lock-object
tests/829-mixed-deconstruction
tests/829-null-coalescing-assignment
tests/829-null-conditional-assignment
tests/829-object-initializer-indexer
tests/829-overload-resolution-priority
tests/829-params-collections
tests/829-pattern-matching-improvements
tests/829-primary-constructors
tests/829-ref-unsafe-in-iterators-async
tests/829-sealed-record-tostring
tests/829-target-typed-conditional
tests/829-tuple-comparison
win-a11y-textsize
1.0-Beta
1.0-M1
1.0-M2
1.0-M3
1.0.0
2.0.0
2.1
2.2
2.3
2.3.1
3.0-Preview1
3.0-Preview2
3.0.2
v10.0
v10.0-preview1
v10.0-preview2
v10.0-preview3
v10.0.1
v10.1
v10.1.1
v11.0
v11.0-preview1
v11.0-rc
v2.3.2
v2.4
v3.0
v3.0-beta1
v3.0-beta2
v3.0-beta2a
v3.0-beta3
v3.0-beta4
v3.0.1
v3.1-beta1
v3.1-final
v3.1-rc
v3.2-beta
v3.2-rc
v3.2.0
v4.0
v4.0-alpha1
v4.0-beta1
v4.0-beta2
v4.0-beta3
v4.0-rc1
v4.0-rc2
v4.0.1
v5.0
v5.0-preview1
v5.0-preview2
v5.0-preview3
v5.0-preview4
v5.0-rc1
v5.0.1
v5.0.2
v6.0
v6.0-preview1
v6.0-preview2
v6.0-preview3
v6.0-preview4
v6.0-rc1
v6.1
v6.2
v6.2-preview1
v6.2-preview2
v6.2.1
v7.0
v7.0-preview1
v7.0-preview2
v7.0-preview3
v7.0-rc1
v7.0-rc2
v7.1
v7.2
v7.2-preview1
v7.2-preview2
v7.2-preview3
v7.2-preview4
v7.2-rc
v7.2.1
v8.0
v8.0-preview1
v8.0-preview2
v8.0-preview3
v8.0-preview4
v8.0-rc1
v8.1
v8.1.1
v8.2
v9.0
v9.0-preview1
v9.0-preview2
v9.0-preview3
v9.0-rc
v9.1
${ item.name }
${ noResults }
3 Commits (fix/2093-navigateto-reference-assembly)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
af941339c0 |
Fix #2054: repair a chain of type forwarders that cycles
A chain of type forwarders is followed by assembly name, and every name resolves relative to the assembly being decompiled - so a chain that leaves for another framework can be pulled straight back into the directory it started in. A .NET Standard 2.0 assembly sitting among .NET Framework 4.6.1 facades lost System.Linq.Enumerable that way: the chain went netstandard -> System.Core (from the shared framework) -> System.Linq (back to the input directory) -> netstandard, arriving at an assembly it had already passed through. Nothing in the closure defines the type, so it stayed unknown and every LINQ call decompiled as a static call with a delegate cast. Once the closure is loaded, chains that return to an assembly they already visited are walked a second time, resolving each hop next to the assembly that forwards it. The assembly ending the repaired chain is loaded only once it is confirmed to declare the type; it then wins the deduplication against the assembly of the same name it displaces, which version order says nothing about. An assembly that neither forwards nor declares the type ends the walk with nothing loaded, so a failed repair cannot displace anything. Only chains that are already broken are walked twice. Preferring the forwarder's own directory as a resolution policy was tried first and rejected: measured against a corpus, it moved a .NET 8 facade's System.Runtime reference out of a net4x compilation, splitting type identities so that overrides printed as virtual. The two cases cannot be told apart where references are resolved, because that layer sees assembly names, not the type whose chain is or is not terminating. AssemblyReference now knows the module that declares it, which is what lets a hop be resolved next to its forwarder, and its metadata reader is that module's. A chain that cannot be repaired is reported in the reference load log the UI already shows, once per reference: a facade forwards hundreds of types and they all fail together. Assisted-by: Claude:claude-opus-5:Claude Code |
2 weeks ago |
|
|
e1e16b64f5 |
dev: Strip BOM mark from text files
|
1 year ago |
|
|
5734da4294 |
Fix #2314: ILSpy incorrectly resolves a runtime dependency when dll is present in both WindowsDesktop.App and NETCore.App
|
6 years ago |