terrafx / terrafx.interop.windows

Interop bindings for Windows.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Investigate using non-strongly typed VTBLs

tannergooding opened this issue · comments

@jkotas suggested here that using non-strongly typed VTBLs might be beneficial for IL Linking.

The type definitions currently look like this: https://github.com/terrafx/terrafx.interop.windows/blob/master/sources/Interop/Windows/um/Unknwnbase/IUnknown.cs

Such a modification might look like:

using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

namespace TerraFX.Interop
{
    [Guid("00000000-0000-0000-C000-000000000046")]
    public unsafe partial struct IUnknown
    {
        public void** lpVtbl;

        [return: NativeTypeName("HRESULT")]
        public int QueryInterface([NativeTypeName("const IID &")] Guid* riid, [NativeTypeName("void **")] void** ppvObject)
        {
            return ((delegate* stdcall<IUnknown*, Guid*, void**, int>)(lpVtbl[0]))((IUnknown*)Unsafe.AsPointer(ref this), riid, ppvObject);
        }

        [return: NativeTypeName("ULONG")]
        public uint AddRef()
        {
            return ((delegate* stdcall<IUnknown*, uint>)(lpVtbl[1]))((IUnknown*)Unsafe.AsPointer(ref this));
        }

        [return: NativeTypeName("ULONG")]
        public uint Release()
        {
            var release = ((delegate* stdcall<IUnknown*, uint>)(lpVtbl[2]));
            return release((IUnknown*)Unsafe.AsPointer(ref this));
        }
    }
}

This was resolved in #84