File: Marshalling\ClrDataAddress.cs
Web Access
Project: src\src\runtime\src\native\managed\cdac\Microsoft.Diagnostics.DataContractReader.Legacy\Microsoft.Diagnostics.DataContractReader.Legacy.csproj (Microsoft.Diagnostics.DataContractReader.Legacy)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Runtime.InteropServices.Marshalling;

namespace Microsoft.Diagnostics.DataContractReader.Legacy;

/// <summary>
/// Represents the native CLRDATA_ADDRESS 64-bit type which uses sign extending
/// when converting from 32-bit values to 64-bit values.
/// When marshalled to native code, this type is represented as a 64-bit unsigned integer.
/// </summary>
[NativeMarshalling(typeof(ClrDataAddressMarshaller))]
public struct ClrDataAddress : IEquatable<ClrDataAddress>
{
    public ulong Value;

    public ClrDataAddress(ulong value) => Value = value;

    public static implicit operator ulong(ClrDataAddress a) => a.Value;
    public static implicit operator ClrDataAddress(ulong v) => new ClrDataAddress(v);

    public override bool Equals(object? obj) => obj is ClrDataAddress address && Equals(address);
    public readonly bool Equals(ClrDataAddress other) => Value == other.Value;
    public override readonly int GetHashCode() => Value.GetHashCode();

    public override readonly string ToString() => $"0x{Value:x}";
}

[CustomMarshaller(typeof(ClrDataAddress), MarshalMode.Default, typeof(ClrDataAddressMarshaller))]
public static class ClrDataAddressMarshaller
{
    public static ClrDataAddress ConvertToManaged(ulong address) => new ClrDataAddress(address);
    public static ulong ConvertToUnmanaged(ClrDataAddress address) => address.Value;
}