From 234c733bde7e74c684d5b7423333007ab52c41ab Mon Sep 17 00:00:00 2001 From: Elinor Fung Date: Thu, 12 Mar 2020 15:05:58 -0700 Subject: [PATCH] Check if global instance is registered --- .../Runtime/InteropServices/ComWrappers.cs | 8 ++++ .../InteropServices/Marshal.CoreCLR.cs | 39 +++++++++++++------ 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.cs index 731437a123009..6ac8a57a2001b 100644 --- a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.cs +++ b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.cs @@ -289,6 +289,14 @@ public void RegisterAsGlobalInstance() } } + /// + /// Get whether or not a global instance has been registered. + /// + internal static bool IsGlobalInstanceRegistered() + { + return s_globalInstance != null; + } + /// /// Get the runtime provided IUnknown implementation. /// diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs index 11b0fdf1241cb..b702d8bff8ed1 100644 --- a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs +++ b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs @@ -331,10 +331,15 @@ public static string GetTypeInfoName(ITypeInfo typeInfo) throw new ArgumentNullException(nameof(o)); } - // Passing null as the ComWrapper implementation will use the globally registered wrappper (if available) - IntPtr ptrMaybe; - if (ComWrappers.TryGetOrCreateComInterfaceForObjectInternal(impl: null, o, CreateComInterfaceFlags.TrackerSupport, out ptrMaybe)) - return ptrMaybe; + if (ComWrappers.IsGlobalInstanceRegistered()) + { + // Passing null as the ComWrapper implementation will use the globally registered wrappper (if available) + IntPtr ptrMaybe; + if (ComWrappers.TryGetOrCreateComInterfaceForObjectInternal(impl: null, o, CreateComInterfaceFlags.TrackerSupport, out ptrMaybe)) + { + return ptrMaybe; + } + } return GetIUnknownForObjectNative(o, false); } @@ -420,10 +425,15 @@ public static object GetObjectForIUnknown(IntPtr /* IUnknown* */ pUnk) throw new ArgumentNullException(nameof(pUnk)); } - // Passing null as the ComWrapper implementation will use the globally registered wrappper (if available) - object? objMaybe; - if (ComWrappers.TryGetOrCreateObjectForComInstanceInternal(impl: null, pUnk, CreateObjectFlags.TrackerObject, wrapperMaybe: null, out objMaybe)) - return objMaybe!; + if (ComWrappers.IsGlobalInstanceRegistered()) + { + // Passing null as the ComWrapper implementation will use the globally registered wrappper (if available) + object? objMaybe; + if (ComWrappers.TryGetOrCreateObjectForComInstanceInternal(impl: null, pUnk, CreateObjectFlags.TrackerObject, wrapperMaybe: null, out objMaybe)) + { + return objMaybe!; + } + } return GetObjectForIUnknownNative(pUnk); } @@ -438,10 +448,15 @@ public static object GetUniqueObjectForIUnknown(IntPtr unknown) throw new ArgumentNullException(nameof(unknown)); } - // Passing null as the ComWrapper implementation will use the globally registered wrappper (if available) - object? objMaybe; - if (ComWrappers.TryGetOrCreateObjectForComInstanceInternal(impl: null, unknown, CreateObjectFlags.TrackerObject | CreateObjectFlags.UniqueInstance, wrapperMaybe: null, out objMaybe)) - return objMaybe!; + if (ComWrappers.IsGlobalInstanceRegistered()) + { + // Passing null as the ComWrapper implementation will use the globally registered wrappper (if available) + object? objMaybe; + if (ComWrappers.TryGetOrCreateObjectForComInstanceInternal(impl: null, unknown, CreateObjectFlags.TrackerObject | CreateObjectFlags.UniqueInstance, wrapperMaybe: null, out objMaybe)) + { + return objMaybe!; + } + } return GetUniqueObjectForIUnknownNative(unknown); }