diff --git a/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs b/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs index 396e97e1a..48bb1598a 100644 --- a/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs +++ b/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs @@ -1012,7 +1012,8 @@ namespace ICSharpCode.Decompiler.Ast // Convert 'ref' into 'out' where necessary for (int i = 0; i < methodArgs.Count && i < cecilMethod.Parameters.Count; i++) { DirectionExpression dir = methodArgs[i] as DirectionExpression; - if (dir != null && cecilMethod.Parameters[i].IsOut) + ParameterDefinition p = cecilMethod.Parameters[i]; + if (dir != null && p.IsOut && !p.IsIn) dir.FieldDirection = FieldDirection.Out; } } diff --git a/ICSharpCode.Decompiler/Tests/PInvoke.cs b/ICSharpCode.Decompiler/Tests/PInvoke.cs index fe9b9b5bc..0c828ac69 100644 --- a/ICSharpCode.Decompiler/Tests/PInvoke.cs +++ b/ICSharpCode.Decompiler/Tests/PInvoke.cs @@ -84,4 +84,13 @@ public class PInvoke public void CustomMarshal2([MarshalAs(UnmanagedType.CustomMarshaler, MarshalType = "MyCompany.MyMarshaler", MarshalCookie = "Cookie")] object o) { } + + [DllImport("ws2_32.dll", SetLastError = true)] + internal static extern IntPtr ioctlsocket([In] IntPtr socketHandle, [In] int cmd, [In] [Out] ref int argp); + + public void CallMethodWithInOutParameter() + { + int num = 0; + PInvoke.ioctlsocket(IntPtr.Zero, 0, ref num); + } }