From 93a1f520c813822a134a09a9c65f42e80a50e07f Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 16 Jun 2023 17:45:51 +0200 Subject: [PATCH] [bgen] Make the generated code check for zero handle before creating an INativeObject wrapper instance. Fixes part of #18452. Also don't create the instance directly from third-party bindings, the required constructor might not be public - use Runtime.GetINativeObject instead. Fixes part 4 of https://github.com/xamarin/xamarin-macios/issues/18452. --- src/bgen/Generator.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/bgen/Generator.cs b/src/bgen/Generator.cs index 6bfdb3a107a0..33a6c788a629 100644 --- a/src/bgen/Generator.cs +++ b/src/bgen/Generator.cs @@ -706,7 +706,10 @@ public TrampolineInfo MakeTrampoline (Type t) if (TypeManager.INativeObject.IsAssignableFrom (pi.ParameterType)) { pars.Add (new TrampolineParameterInfo (NativeHandleType, safe_name)); - invoke.AppendFormat ("new {0} ({1}, false)", pi.ParameterType, safe_name); + if (BindThirdPartyLibrary) + invoke.AppendFormat ("Runtime.GetINativeObject<{0}> ({1}, false)!", pi.ParameterType, safe_name); + else + invoke.AppendFormat ("{1} == IntPtr.Zero ? null! : new {0} ({1}, false)", pi.ParameterType, safe_name); continue; }