PointerToolkit 1.0.0-preview3
See the version list below for details.
dotnet add package PointerToolkit --version 1.0.0-preview3
NuGet\Install-Package PointerToolkit -Version 1.0.0-preview3
<PackageReference Include="PointerToolkit" Version="1.0.0-preview3" />
paket add PointerToolkit --version 1.0.0-preview3
#r "nuget: PointerToolkit, 1.0.0-preview3"
// Install PointerToolkit as a Cake Addin #addin nuget:?package=PointerToolkit&version=1.0.0-preview3&prerelease // Install PointerToolkit as a Cake Tool #tool nuget:?package=PointerToolkit&version=1.0.0-preview3&prerelease
PointerToolkit
Provides structs that wrap pointers, as well as Unsafe
, Interlocked
, and Volatile
operations on ref pointers.
Even using the built-in System.Runtime.CompilerServices.Unsafe
class, you cannot reinterpret ref
s to raw pointers for use in calls to methods such as Interlocked.Exchange()
or Volatile.Read()
.
Pointers up to 3 levels of indirection are supported, e.g. void***
and T***
. The helper classes UnsafePtr
, InterlockedPtr
, and VolatilePtr
are provided.
We may get this in .NET itself someday, if https://github.com/dotnet/runtime/issues/62342 is approved and landed. Until then, you can use this.
CastPtr<...>
is also provided, which can be used to generate static __cast()
"method operators." This solves the problem where you have (e.g.) an ID2D1SolidColorBrush*
that you need to pass to a method that takes a pointer to a base interface, such as ID2D1Brush*
. Instead of forcing a pointer cast with (ID2D1Brush*)
, which denies the compiler a chance to verify that the cast is safe, you can use __cast(p)
(along with an appropriate using static
declaration). A temporary CastPtr<ID2D1SolidColorBrush, ID2D1Brush, ID2D1Resource, IUnknown>
will be created which will implicitly cast to pointers of all the base interface pointer types. (Note that "interface" in this case refers to a COM interface, not a managed interface.) The generation of these __cast()
operators is not yet provided by this package, but is currently prototyped in the Paint.NET codebase to help with my use of TerraFX.Interop.Windows.
namespace PointerToolkit;
public static unsafe class UnsafePtr
{
public static ref T As<T>(ref void* source)
where T : unmanaged;
public static ref U As<T, U>(ref T* source)
where T : unmanaged
where U : unmanaged;
// etc.
}
public static unsafe class InterlockedPtr
{
public static void* Exchange(ref void* location1, void* value);
public static T* Exchange<T>(ref T* location1, T* value)
where T : unmanaged;
// etc.
}
public static unsafe class VolatilePtr
{
public static void* Read(ref void* location);
public static T* Read<T>(ref T* location)
where T : unmanaged;
public static void Write(ref void* location, void* value);
public static void Write<T>(ref T* location, T* value)
where T : unmanaged;
// etc.
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.0.1 | 278 | 12/30/2023 |
1.0.0 | 452 | 11/29/2022 |
1.0.0-preview8 | 159 | 11/9/2022 |
1.0.0-preview7 | 233 | 1/26/2022 |
1.0.0-preview6 | 178 | 1/3/2022 |
1.0.0-preview5 | 168 | 12/7/2021 |
1.0.0-preview4 | 187 | 12/7/2021 |
1.0.0-preview3 | 462 | 12/4/2021 |
1.0.0-preview2 | 420 | 12/4/2021 |
1.0.0-preview1 | 420 | 12/4/2021 |