diff --git a/src/coreclr/src/vm/dllimportcallback.cpp b/src/coreclr/src/vm/dllimportcallback.cpp index 9ec4153e651fc3..be989d1f6097db 100644 --- a/src/coreclr/src/vm/dllimportcallback.cpp +++ b/src/coreclr/src/vm/dllimportcallback.cpp @@ -629,6 +629,9 @@ VOID UMThunkMarshInfo::SetUpForUnmanagedCallersOnly() CorPinvokeMap callConv = (CorPinvokeMap)0; HRESULT hr = pMD->GetCustomAttribute(WellKnownAttribute::UnmanagedCallersOnly, (const VOID **)(&pData), (ULONG *)&cData); + if (hr == S_FALSE) + hr = pMD->GetCustomAttribute(WellKnownAttribute::NativeCallableInternal, (const VOID **)(&pData), (ULONG *)&cData); + IfFailThrow(hr); _ASSERTE(cData > 0); diff --git a/src/coreclr/src/vm/method.cpp b/src/coreclr/src/vm/method.cpp index 690051b905bf84..fb7d73f791d5b4 100644 --- a/src/coreclr/src/vm/method.cpp +++ b/src/coreclr/src/vm/method.cpp @@ -5429,6 +5429,15 @@ BOOL MethodDesc::HasUnmanagedCallersOnlyAttribute() WellKnownAttribute::UnmanagedCallersOnly, nullptr, nullptr); + if (hr != S_OK) + { + // See https://github.com/dotnet/runtime/issues/37622 + hr = GetCustomAttribute( + WellKnownAttribute::NativeCallableInternal, + nullptr, + nullptr); + } + return (hr == S_OK) ? TRUE : FALSE; } diff --git a/src/coreclr/src/vm/wellknownattributes.h b/src/coreclr/src/vm/wellknownattributes.h index be38b0be88cfe0..11911910865106 100644 --- a/src/coreclr/src/vm/wellknownattributes.h +++ b/src/coreclr/src/vm/wellknownattributes.h @@ -31,6 +31,7 @@ enum class WellKnownAttribute : DWORD PrimaryInteropAssembly, ManagedToNativeComInteropStub, UnmanagedCallersOnly, + NativeCallableInternal, // This is needed to support MCG scenarios TypeIdentifier, UnmanagedFunctionPointer, ThreadStatic, @@ -92,6 +93,8 @@ inline const char *GetWellKnownAttributeName(WellKnownAttribute attribute) return "System.Runtime.InteropServices.ManagedToNativeComInteropStubAttribute"; case WellKnownAttribute::UnmanagedCallersOnly: return "System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute"; + case WellKnownAttribute::NativeCallableInternal: + return "System.Runtime.InteropServices.NativeCallableInternalAttribute"; case WellKnownAttribute::TypeIdentifier: return "System.Runtime.InteropServices.TypeIdentifierAttribute"; case WellKnownAttribute::UnmanagedFunctionPointer: