Major announcement at .NET CONF 2022 .NET7 which some of you many have missed, replaces DLLImport() with LibraryImport().
Official documentation here -
Use custom marshallers in source-generated P/Invokes | Microsoft Learn
Sampe Pseudo Code
// Import user32.dll (containing the function we need) and define // the method corresponding to the native function. [DllImport("user32.dll", EntryPoint = "MessageBoxW", CharSet = CharSet.Unicode, SetLastError = true)] private static extern int MessageBoxW(IntPtr hWnd, wstring lpText, string lpCaption, uint uType); //>>>>>>>>>>>> .NET7 New P/Invoke Method <<<<<<<<<<<< [LibraryImport("user32.dll", EntryPoint = "MessageBoxW", SetLastError =true, StringMarshalling = StringMarshalling.Utf16)] internal static partial int MessageBoxW(IntPtr hWnd, string lpText, string lpCaption, uint uType);
Differences from DllImport
LibraryImportAttribute is intended to be a straightforward conversion from DllImportAttribute in most cases, but there are some intentional changes:
- CallingConvention has no equivalent on LibraryImportAttribute. UnmanagedCallConvAttribute should be used instead.
- CharSet (for CharSet) has been replaced with StringMarshalling (for StringMarshalling). ANSI has been removed and UTF-8 is now available as a first-class option.
- BestFitMapping and ThrowOnUnmappableChar have no equivalent. These were only relevant when marshalling an ANSI string on Windows. The generated code for marshalling an ANSI string will have the equivalent behaviour of
BestFitMapping=false
andThrowOnUnmappableChar=false
. - ExactSpelling has no equivalent. This was a Windows-centric setting and had no effect on non-Windows. The method name or EntryPoint should be the exact spelling of the entry point name. This field has historical uses related to the
A
andW
suffixes used in Win32 programming. - PreserveSig has no equivalent. This was a Windows-centric setting. The generated code always directly translates the signature.
There are also differences in support for some settings on MarshalAsAttribute, default marshalling of certain types, and other interop-related attributes. For more details, see our documentation on compatibility differences.
.NET CONF 2022 Video Release