From aba1d1f13869e16d9363856315bfeaa05c5c0c97 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 27 Feb 2025 10:34:01 +0100 Subject: [PATCH 1/3] [mono] Fix detecting [DisableRuntimeMarshalling] in MarshalingPInvokeScanner. Fix detecting the [DisableRuntimeMarshalling] attribute in MarshalingPInvokeScanner for assemblies that reference the attribute from another assembly (i.e. any assembly except System.Runtime.dll). Fixes https://github.com/dotnet/runtime/issues/112980. --- .../MarshalingPInvokeScanner.cs | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs b/src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs index dd77ae97fcd135..d0f30ace3d2491 100644 --- a/src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs +++ b/src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs @@ -104,6 +104,12 @@ private void ResolveInconclusiveTypes(HashSet incompatible, string assyP } } + private bool IsDisableRuntimeMarshallingAttribute (MetadataReader mdtReader, StringHandle ns, StringHandle name) + { + return mdtReader.GetString(ns) == "System.Runtime.CompilerServices" && + mdtReader.GetString(name) == "DisableRuntimeMarshallingAttribute"; + } + private bool IsAssemblyIncompatible(string assyPath, MinimalMarshalingTypeCompatibilityProvider mmtcp) { using FileStream file = new FileStream(assyPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); @@ -124,10 +130,20 @@ private bool IsAssemblyIncompatible(string assyPath, MinimalMarshalingTypeCompat TypeDefinitionHandle tdh = md.GetDeclaringType(); TypeDefinition td = mdtReader.GetTypeDefinition(tdh); - if (mdtReader.GetString(td.Namespace) == "System.Runtime.CompilerServices" && - mdtReader.GetString(td.Name) == "DisableRuntimeMarshallingAttribute") + if (IsDisableRuntimeMarshallingAttribute(mdtReader, td.Namespace, td.Name)) return false; } + else if(attr.Constructor.Kind == HandleKind.MemberReference) + { + MemberReferenceHandle mrh = (MemberReferenceHandle)attr.Constructor; + MemberReference mr = mdtReader.GetMemberReference(mrh); + if (mr.Parent.Kind == HandleKind.TypeReference) { + TypeReference tr = mdtReader.GetTypeReference((TypeReferenceHandle)mr.Parent); + + if (IsDisableRuntimeMarshallingAttribute(mdtReader, tr.Namespace, tr.Name)) + return false; + } + } } foreach (TypeDefinitionHandle typeDefHandle in mdtReader.TypeDefinitions) From 599bb7c36c5eccb1541ae8eef5aa5325028d6a80 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 27 Feb 2025 17:13:57 +0100 Subject: [PATCH 2/3] Update src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs Co-authored-by: Theodore Tsirpanis --- .../MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs b/src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs index d0f30ace3d2491..7135f2ef0605e6 100644 --- a/src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs +++ b/src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs @@ -106,8 +106,8 @@ private void ResolveInconclusiveTypes(HashSet incompatible, string assyP private bool IsDisableRuntimeMarshallingAttribute (MetadataReader mdtReader, StringHandle ns, StringHandle name) { - return mdtReader.GetString(ns) == "System.Runtime.CompilerServices" && - mdtReader.GetString(name) == "DisableRuntimeMarshallingAttribute"; + return mdtReader.StringComparer.Equals(ns, "System.Runtime.CompilerServices") && + mdtReader.StringComparer.Equals(name, "DisableRuntimeMarshallingAttribute"); } private bool IsAssemblyIncompatible(string assyPath, MinimalMarshalingTypeCompatibilityProvider mmtcp) From ec89808ff05b0b7449f0164a0bdaf7fa8b8664b9 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 3 Mar 2025 08:00:06 +0100 Subject: [PATCH 3/3] Fix formatting. --- .../MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs b/src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs index 7135f2ef0605e6..6747e9ef56a427 100644 --- a/src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs +++ b/src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs @@ -104,7 +104,7 @@ private void ResolveInconclusiveTypes(HashSet incompatible, string assyP } } - private bool IsDisableRuntimeMarshallingAttribute (MetadataReader mdtReader, StringHandle ns, StringHandle name) + private static bool IsDisableRuntimeMarshallingAttribute(MetadataReader mdtReader, StringHandle ns, StringHandle name) { return mdtReader.StringComparer.Equals(ns, "System.Runtime.CompilerServices") && mdtReader.StringComparer.Equals(name, "DisableRuntimeMarshallingAttribute"); @@ -133,7 +133,7 @@ private bool IsAssemblyIncompatible(string assyPath, MinimalMarshalingTypeCompat if (IsDisableRuntimeMarshallingAttribute(mdtReader, td.Namespace, td.Name)) return false; } - else if(attr.Constructor.Kind == HandleKind.MemberReference) + else if (attr.Constructor.Kind == HandleKind.MemberReference) { MemberReferenceHandle mrh = (MemberReferenceHandle)attr.Constructor; MemberReference mr = mdtReader.GetMemberReference(mrh);