MarshalingPInvokeScanner doesn't see [DisableRuntimeMarshalling] attributes in any assembly except System.Runtime.dll · Issue #112980 · dotnet/runtime (original) (raw)
The MarshalingPInvokeScanner task doesn't see [DisableRuntimeMarshalling] attributes defined in any assembly except System.Runtime.dll (where the attribute is defined).
The problem is that this code:
foreach (CustomAttributeHandle attrHandle in mdtReader.CustomAttributes) |
---|
{ |
CustomAttribute attr = mdtReader.GetCustomAttribute(attrHandle); |
if (attr.Constructor.Kind == HandleKind.MethodDefinition) |
{ |
MethodDefinitionHandle mdh = (MethodDefinitionHandle)attr.Constructor; |
MethodDefinition md = mdtReader.GetMethodDefinition(mdh); |
TypeDefinitionHandle tdh = md.GetDeclaringType(); |
TypeDefinition td = mdtReader.GetTypeDefinition(tdh); |
if (mdtReader.GetString(td.Namespace) == "System.Runtime.CompilerServices" && |
mdtReader.GetString(td.Name) == "DisableRuntimeMarshallingAttribute") |
return false; |
} |
} |
does not take into account that the attribute's constructor will be a MethodReference when referencing a constructor defined in another assembly.
Repro:
- Clone https://github.com/rolfbjarne/marshalling-scanner (including submodules)
- Run
make disable-runtime-marshalling-attribute
This happens:
[...]
Assembly /Users/rolf/test/dotnet/marshalling-scanner/disable-runtime-marshalling-attribute/bin/Debug/net9.0/disable-runtime-marshalling-attribute.dll requires marshal-ilgen for method .Class1:DoSomething (first pass).
❌ Failed, because some assemblies are incompatible
make: *** [disable-runtime-marshalling-attribute] Error 1