From 9eec4c0d7549f6f3f5bf6f1c3970deaec517939e Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Mon, 8 Jun 2020 15:45:23 -0700 Subject: [PATCH 1/2] Accept NativeCallableInternalAttribute to support legacy scenario --- src/coreclr/src/vm/dllimportcallback.cpp | 3 +++ src/coreclr/src/vm/method.cpp | 8 ++++++++ src/coreclr/src/vm/wellknownattributes.h | 3 +++ 3 files changed, 14 insertions(+) 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..3ebd739df51d6e 100644 --- a/src/coreclr/src/vm/method.cpp +++ b/src/coreclr/src/vm/method.cpp @@ -5429,6 +5429,14 @@ BOOL MethodDesc::HasUnmanagedCallersOnlyAttribute() WellKnownAttribute::UnmanagedCallersOnly, nullptr, nullptr); + if (hr != S_OK) + { + 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: From 012bc4c8450cad6c64f8a4bd512b869919d17c42 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Mon, 8 Jun 2020 15:57:31 -0700 Subject: [PATCH 2/2] Feedback --- src/coreclr/src/vm/method.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/coreclr/src/vm/method.cpp b/src/coreclr/src/vm/method.cpp index 3ebd739df51d6e..fb7d73f791d5b4 100644 --- a/src/coreclr/src/vm/method.cpp +++ b/src/coreclr/src/vm/method.cpp @@ -5431,6 +5431,7 @@ BOOL MethodDesc::HasUnmanagedCallersOnlyAttribute() nullptr); if (hr != S_OK) { + // See https://github.com/dotnet/runtime/issues/37622 hr = GetCustomAttribute( WellKnownAttribute::NativeCallableInternal, nullptr,