diff --git a/src/libraries/Common/src/System/Runtime/InteropServices/BuiltInVariantExtensions.cs b/src/libraries/Common/src/System/Runtime/InteropServices/BuiltInVariantExtensions.cs index 777a1c03b0a7a2..daedc25c50456c 100644 --- a/src/libraries/Common/src/System/Runtime/InteropServices/BuiltInVariantExtensions.cs +++ b/src/libraries/Common/src/System/Runtime/InteropServices/BuiltInVariantExtensions.cs @@ -21,7 +21,7 @@ private static unsafe ref T GetByRefDataRef(this ref ComVariant variant) return ref Unsafe.AsRef((void*)variant.GetRawDataRef()); } - public static unsafe void CopyFromIndirect(this ref ComVariant variant, object value) + public static unsafe void CopyFromIndirect(this ref ComVariant variant, object? value) { VarEnum vt = (VarEnum)(((int)variant.VarType) & ~((int)VarEnum.VT_BYREF)); @@ -154,9 +154,8 @@ public static unsafe void CopyFromIndirect(this ref ComVariant variant, object v VarEnum.VT_DECIMAL => variant.As(), VarEnum.VT_CY => decimal.FromOACurrency(variant.GetRawDataRef()), VarEnum.VT_DATE => variant.As(), - VarEnum.VT_BSTR => Marshal.PtrToStringBSTR(variant.GetRawDataRef()), - VarEnum.VT_UNKNOWN => Marshal.GetObjectForIUnknown(variant.GetRawDataRef()), - VarEnum.VT_DISPATCH => Marshal.GetObjectForIUnknown(variant.GetRawDataRef()), + VarEnum.VT_BSTR => variant.GetRawDataRef() is 0 ? null : Marshal.PtrToStringBSTR(variant.GetRawDataRef()), + VarEnum.VT_UNKNOWN or VarEnum.VT_DISPATCH => variant.GetRawDataRef() is 0 ? null : Marshal.GetObjectForIUnknown(variant.GetRawDataRef()), _ => GetObjectFromNativeVariant(ref variant), }; } diff --git a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/DynamicVariantExtensions.cs b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/DynamicVariantExtensions.cs index 27647ed388f28e..c8608ce2c9dfa4 100644 --- a/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/DynamicVariantExtensions.cs +++ b/src/libraries/Microsoft.CSharp/src/Microsoft/CSharp/RuntimeBinder/ComInterop/DynamicVariantExtensions.cs @@ -379,14 +379,14 @@ public static void SetBstr(this ref ComVariant variant, string value) variant = ComVariant.Create(new BStrWrapper(value)); } - public static void SetUnknown(this ref ComVariant variant, object value) + public static void SetUnknown(this ref ComVariant variant, object? value) { - variant = ComVariant.CreateRaw(VarEnum.VT_UNKNOWN, Marshal.GetIUnknownForObject(value)); + variant = ComVariant.CreateRaw(VarEnum.VT_UNKNOWN, value is null ? IntPtr.Zero : Marshal.GetIUnknownForObject(value)); } - public static void SetDispatch(this ref ComVariant variant, object value) + public static void SetDispatch(this ref ComVariant variant, object? value) { - variant = ComVariant.CreateRaw(VarEnum.VT_DISPATCH, Marshal.GetIDispatchForObject(value)); + variant = ComVariant.CreateRaw(VarEnum.VT_DISPATCH, value is null ? IntPtr.Zero : Marshal.GetIDispatchForObject(value)); } public static void SetError(this ref ComVariant variant, int value) diff --git a/src/tests/Interop/COM/Dynamic/BasicTest.cs b/src/tests/Interop/COM/Dynamic/BasicTest.cs index 1e6fa7f5604e99..4ec5d6fbbdcccd 100644 --- a/src/tests/Interop/COM/Dynamic/BasicTest.cs +++ b/src/tests/Interop/COM/Dynamic/BasicTest.cs @@ -423,6 +423,9 @@ private void Null() obj.String_Property = null; Assert.Equal(string.Empty, obj.String_Property); + + obj.Dispatch_Property = new DispatchWrapper(null); + Assert.Null(obj.Dispatch_Property); } private void StringWrapper(string toWrap, string expected)