IL3055: P/Invoke-metoden deklarerar en parameter med ett abstrakt ombud

Orsak

P/Invoke marshalling code måste genereras i förväg. Om marshallingskoden för en delegerad inte har förgenererats, kommer P/Invoke-marshalling att misslyckas med ett undantag vid körning.

Marshalling-kod genereras för ombudstyper som antingen:

  • Används i signaturer för P/Invoke-metoder.
  • Visas som fält med typer som skickas till intern kod via P/Invoke.
  • Är dekorerade med UnmanagedFunctionPointerAttribute.

Om en konkret typ inte kan härledas från P/Invoke-signaturen kanske marshallingkoden inte är tillgänglig vid körning och P/Invoke utlöser ett undantag.

Ersätt Delegate eller MulticastDelegate i P/Invoke-signaturen med en konkret ombudstyp.

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);