A collection of libraries intended to contain all P/Invoke method signatures for popular operating systems. Think of it as http://pinvoke.net, but proven to compile and work properly, and often with sample usage in the form of unit tests.
Each library is exposed as its own NuGet package, and may include .NET Portable libraries as applicable, exposing those APIs that are available only on Desktop, or Store, or both as appropriate.
Install the NuGet package(s) for the DLLs you want to P/Invoke into. For example, if you want to P/Invoke into Win32's BCrypt.dll, install this package:
Install-Package PInvoke.BCrypt
Then import the following namespaces, as demonstrated below (if using C# 6):
using PInvoke;
using static PInvoke.BCrypt; // Supported in C# 6 (VS2015) and later.
This will allow you to conveniently call these methods directly by method name:
var error = BCryptOpenAlgorithm(AlgorithmIdentifiers.BCRYPT_SHA256_ALGORITHM); // C# 6 syntax
var error = BCrypt.BCryptOpenAlgorithm(BCrypt.AlgorithmIdentifiers.BCRYPT_SHA256_ALGORITHM); // C# 5 syntax
Sometimes a PInvoke method may have multiple overloads. For example every method that accepts
struct*
parameters has an overload that accepts IntPtr
in its place. In other cases there
may be overloads that accept struct*
and struct?
. In some of these cases that can lead to
compiler errors if you pass in null
because both struct*
and struct?
overloads can match.
To resolve the issue, add a cast to your null: (struct?)null
to resolve the ambiguity.
Cast any uint
to specific enum
type and pass as parameter.
Provide a slightly higher than lowest level API for P/Invoke signatures.
For example, instead of IntPtr
parameters and uint
flags, you'll see SafeHandle
-derived
types as parameters and flags enum
types. API documentation will be provided via XML doc comments
for easy reading with Intellisense, along with links to the describing pages on MSDN
or elsewhere as applicable.
In some cases we offer several overloads of a given native method to offer native pointer and
IntPtr
access. We encourage folks to try writing C# unsafe
code before using IntPtr
because
it (ironically) can often be easier to write correct and efficient code using native pointers than
all the casting and Marshal
call overhead that IntPtr
requires.
Note that when a method's only use of a native pointer is its return type, the IntPtr
returning
variant must be given a different method name by CLR overloading rules, so look for the same method
but with an _IntPtr
suffix.
This library should be available on NuGet for easy consumption by your projects. You may also copy and paste the P/Invoke signatures you need directly into your projects if desired.
Packages:
Library | Package name | NuGet | Description |
---|---|---|---|
advapi32.dll | PInvoke.AdvApi32 |
Windows Advanced Services | |
bcrypt.dll | PInvoke.BCrypt |
Windows Cryptography API: Next Generation | |
crypt32.dll | PInvoke.Crypt32 |
Windows Cryptography API | |
DwmApi.dll | PInvoke.DwmApi |
Desktop Window Manager | |
gdi32.dll | PInvoke.Gdi32 |
Windows Graphics Device Interface | |
hid.dll | PInvoke.Hid |
Windows Human Interface Devices | |
kernel32.dll | PInvoke.Kernel32 |
Windows Kernel API | |
magnification.dll | PInvoke.Magnification |
Windows Magnification API | |
mscoree.dll | PInvoke.MSCorEE |
.NET Framework CLR host | |
msi.dll | PInvoke.Msi |
Microsoft Installer | |
fusion.dll | PInvoke.Fusion |
.NET Framework Fusion | |
ncrypt.dll | PInvoke.NCrypt |
Windows Cryptography API: Next Generation | |
netapi32.dll | PInvoke.NetApi32 |
Network Management | |
ntdll.dll | PInvoke.NTDll |
Windows NTDll | |
psapi.dll | PInvoke.Psapi |
Windows Process Status API | |
setupapi.dll | PInvoke.SetupApi |
Windows setup API | |
shell32.dll | PInvoke.Shell32 |
Windows Shell | |
SHCore.dll | PInvoke.SHCore |
Windows Shell | |
user32.dll | PInvoke.User32 |
Windows User Interface | |
userenv.dll | PInvoke.Userenv |
Windows User Environment | |
uxtheme.dll | PInvoke.UxTheme |
Windows Visual Styles | |
WtsApi32.dll | PInvoke.WtsApi32 |
Windows Remote Desktop Services |
Check out the P/Invoke coverage we have for each library.
Please consider contributing more P/Invoke method signatures to this project. Once you contribute, you can immediately consume your additions without waiting for another public release of the library.