Skip to content

Commit d2650b6

Browse files
[mono] Fix detecting [DisableRuntimeMarshalling] in MarshalingPInvokeScanner. (#112981)
* [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 #112980. * Update src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs Co-authored-by: Theodore Tsirpanis <teo@tsirpanis.gr> * Fix formatting. --------- Co-authored-by: Theodore Tsirpanis <teo@tsirpanis.gr>
1 parent 7e5ca51 commit d2650b6

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

src/tasks/MonoTargetsTasks/MarshalingPInvokeScanner/MarshalingPInvokeScanner.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ private void ResolveInconclusiveTypes(HashSet<string> incompatible, string assyP
104104
}
105105
}
106106

107+
private static bool IsDisableRuntimeMarshallingAttribute(MetadataReader mdtReader, StringHandle ns, StringHandle name)
108+
{
109+
return mdtReader.StringComparer.Equals(ns, "System.Runtime.CompilerServices") &&
110+
mdtReader.StringComparer.Equals(name, "DisableRuntimeMarshallingAttribute");
111+
}
112+
107113
private bool IsAssemblyIncompatible(string assyPath, MinimalMarshalingTypeCompatibilityProvider mmtcp)
108114
{
109115
using FileStream file = new FileStream(assyPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
@@ -124,10 +130,20 @@ private bool IsAssemblyIncompatible(string assyPath, MinimalMarshalingTypeCompat
124130
TypeDefinitionHandle tdh = md.GetDeclaringType();
125131
TypeDefinition td = mdtReader.GetTypeDefinition(tdh);
126132

127-
if (mdtReader.GetString(td.Namespace) == "System.Runtime.CompilerServices" &&
128-
mdtReader.GetString(td.Name) == "DisableRuntimeMarshallingAttribute")
133+
if (IsDisableRuntimeMarshallingAttribute(mdtReader, td.Namespace, td.Name))
129134
return false;
130135
}
136+
else if (attr.Constructor.Kind == HandleKind.MemberReference)
137+
{
138+
MemberReferenceHandle mrh = (MemberReferenceHandle)attr.Constructor;
139+
MemberReference mr = mdtReader.GetMemberReference(mrh);
140+
if (mr.Parent.Kind == HandleKind.TypeReference) {
141+
TypeReference tr = mdtReader.GetTypeReference((TypeReferenceHandle)mr.Parent);
142+
143+
if (IsDisableRuntimeMarshallingAttribute(mdtReader, tr.Namespace, tr.Name))
144+
return false;
145+
}
146+
}
131147
}
132148

133149
foreach (TypeDefinitionHandle typeDefHandle in mdtReader.TypeDefinitions)

0 commit comments

Comments
 (0)