From a5ed5ec5cb9023e6e4b2d1b7c3585a63930d2022 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 19 Jul 2024 19:34:32 +0200 Subject: [PATCH] Support types that provide DisposeAsync without implementing IAsyncDisposable. --- .../IL/Transforms/UsingTransform.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ICSharpCode.Decompiler/IL/Transforms/UsingTransform.cs b/ICSharpCode.Decompiler/IL/Transforms/UsingTransform.cs index 8a61d7931..4315464f1 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/UsingTransform.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/UsingTransform.cs @@ -367,7 +367,9 @@ namespace ICSharpCode.Decompiler.IL.Transforms } disposeCall = cv; } - if (disposeCall.Method.FullName != disposeMethodFullName) + if (disposeCall.Method.IsStatic) + return false; + if (disposeCall.Method.Name != "DisposeAsync") return false; if (disposeCall.Method.Parameters.Count > 0) return false; @@ -505,9 +507,14 @@ namespace ICSharpCode.Decompiler.IL.Transforms return false; if (!awaitInstruction.MatchAwait(out var arg)) return false; - if (!arg.MatchAddressOf(out awaitInstruction, out var type)) - return false; - // TODO check type: does it match the structural 'Awaitable' pattern? + if (arg.MatchAddressOf(out var awaitInstructionInAddressOf, out var type)) + { + awaitInstruction = awaitInstructionInAddressOf; + } + else + { + awaitInstruction = arg; + } return true; } }