IL3055: De methode P/Invoke declareert een parameter met een abstracte gemachtigde

Oorzaak

P/Aanroepen van marshallcode moet van tevoren worden gegenereerd. Als marshallcode voor een gemachtigde niet vooraf is gegenereerd, mislukt P/Invoke-marshalling met een uitzondering tijdens runtime.

Marshalling-code wordt gegenereerd voor gedelegeerde typen die:

  • Worden gebruikt in handtekeningen van P/Invoke-methoden.
  • Worden weergegeven als velden van typen die worden doorgegeven aan systeemeigen code via P/Invoke.
  • Zijn versierd met UnmanagedFunctionPointerAttribute.

Als een concreet type niet kan worden afgeleid van de P/Invoke-handtekening, is marshallingcode mogelijk niet beschikbaar tijdens runtime en genereert de P/Invoke een uitzondering.

Vervang Delegate of MulticastDelegate in de P/Invoke-handtekening door een specifiek delegeer-type.

Example

using System;
using System.Runtime.InteropServices;

PinvokeMethod(() => { });

// AOT analysis warning IL3055: Program.<Main>$(String[]): P/invoke method
// 'Program.<<Main>$>g__PinvokeMethod|0_1(Delegate)' declares a parameter with an abstract delegate.
// Correctness of interop for abstract delegates cannot be guaranteed after native compilation:
// the marshalling code for the delegate might not be available. Use a non-abstract delegate type
// or ensure any delegate instance passed as parameter is marked with `UnmanagedFunctionPointerAttribute`.
[DllImport("library")]
static extern void PinvokeMethod(Delegate del);